CREATE OR REPLACE PACKAGE provider_connect_claims_pkg AS
  /********************************************************************************************************************
  ** NAME                 : provider_connect_claims_pkg                                                              **
  **                                                                                                                 **
  ** VERSION              : 1.0                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : Process to search claims and display claim details for Provider portal UI Screen         **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 04/08/2024                                                                               **
  **-----------------------------------------------------------------------------------------------------------------**
  ** CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                 **
  ** ---------------| ------------ | -----------| -------------------------------------------------------------------**
  ** 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                    **
  ********************************************************************************************************************/

  /********************************************************************************************************************
  * Declaration and Initializing Procedures                                                                          **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_claim_search_prc           (v_jsonIn IN CLOB,v_response OUT CLOB); -- Procedure to search claim details based on user search
  PROCEDURE provider_connect_claim_summary_get_prc      (v_jsonIn IN CLOB,v_response OUT CLOB); -- Procedure to get claims details
  PROCEDURE provider_connect_payment_details_get_prc    (v_jsonIn IN CLOB,v_response OUT CLOB); -- Procedure to get claims details
  PROCEDURE provider_connect_claim_line_details_get_prc (v_jsonIn IN CLOB,v_response OUT CLOB); -- Procedure to get claim line details
  PROCEDURE provider_connect_claim_download_prc         (
                                                         v_clm_number         IN CLOB,
                                                         v_begin_date         IN VARCHAR2,
                                                         v_end_date           IN VARCHAR2,
                                                         v_mem_member_id      IN VARCHAR2,
                                                         v_mem_first_name     IN VARCHAR2,
                                                         v_mem_last_name      IN VARCHAR2,
                                                         v_mem_dob            IN VARCHAR2,
                                                         v_patient_ssn        IN VARCHAR2,
                                                         v_mem_medicaid_id    IN VARCHAR2,
                                                         v_check_number       IN VARCHAR2,
                                                         v_prov_tin           IN VARCHAR2,
                                                         v_prov_npi           IN VARCHAR2,
                                                         v_xmlout            OUT CLOB
                                                        );                                      -- Procedure to download report for claim page details

  FUNCTION  get_claim_lists                             (v_claim_id VARCHAR2) RETURN VARCHAR2;  -- Function to get claim list when multiple claims are entered into search

END provider_connect_claims_pkg ;
/

CREATE OR REPLACE PACKAGE BODY provider_connect_claims_pkg AS
  ------------------------------------------------------------------------------------------
  -- Global variables declaration
  ------------------------------------------------------------------------------------------
  v_return_code    VARCHAR2(10);
  v_program_error  EXCEPTION;
  v_query          CLOB;

  /********************************************************************************************************************
  ** NAME                 : provider_connect_claim_search_prc                                                        **
  **                                                                                                                 **
  ** VERSION              : 1.4                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To get claim details for claims search criteria for claims UI screen                     **
  **                                                                                                                 **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : JSONIN CLOB                                                                              **
  **               OUTPUT : Response with Data base result-set                                                       **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 05/09/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                     **
  * 1.1            | 04/10/2024   | Cognizant  | Pagination changes                                                  **
  * 1.2            | 05/06/2024   | Cognizant  | Fetch claims within user entered date range                         **
  * 1.3            | 05/08/2024   | Cognizant  | Added source condition to remove duplicate patient information under**
  *                                              the same claim numbers                                              **
  * 1.4            | 05/09/2024   | Cognizant  | Logic to include pended claims                                      **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_claim_search_prc (v_jsonIn IN CLOB,v_response OUT CLOB)
  AS
    /***********************
    {
     "UserProfile":
     {
     },
     "Filter":
     {
     },
     "Offset":"",
     "Limit":""
    }
    ************************/
    ------------------------------------------------------------------------------------------
    -- Initializing variables for json objects / arrays
    ------------------------------------------------------------------------------------------
    v_jsonObj                   JSON_OBJECT_T  := JSON_OBJECT_T.parse(v_jsonIn);
    v_claims_search_obj         JSON_OBJECT_T;
    v_claims_search_ary         JSON_ARRAY_T   := JSON_ARRAY_T ();
    v_response_obj              JSON_OBJECT_T  := JSON_OBJECT_T();

    ------------------------------------------------------------------------------------------
    -- Initializing variables for input parameters
    ------------------------------------------------------------------------------------------
    v_claim_number    CLOB            := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Number'));
    v_begin_date      VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Begin_Date'));
    v_end_date        VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('End_Date'));
    v_mem_member_id   VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Member_Id'));
    v_mem_first_name  VARCHAR2(100)   := TRIM(LOWER(v_jsonObj.get_Object('Filter').get_String('First_Name')));
    v_mem_last_name   VARCHAR2(100)   := TRIM(LOWER(v_jsonObj.get_Object('Filter').get_String('Last_Name')));
    v_mem_dob         VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Dob'));
    v_patient_ssn     VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Patient_Ssn'));
    v_mem_medicaid_id VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Medicaid_Id'));
    v_check_number    VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Check_Number'));
    v_prov_tin        VARCHAR2(30)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Prov_Tin'));
    v_prov_npi        VARCHAR2(50)    := TRIM(v_jsonObj.get_Object('Filter').get_String('Prov_Npi'));

    -- V 1.1 Changes Begin
    v_rows_perpage    CLOB            := TRIM(v_jsonObj.get_Object('Filter').get_String('Rows_Per_Page'));
    v_page_num        CLOB            := TRIM(v_jsonObj.get_Object('Filter').get_String('Page_Number'));
    -- V 1.1 Changes End

    ------------------------------------------------------------------------------------------
    -- Initializing variables for user profile
    ------------------------------------------------------------------------------------------
    v_user_id                CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Id'));
    v_user_name              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Name'));
    v_user_role              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Role'));
    v_user_tin               CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Tin'));
    --v_user_npi             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Npi'));
    v_usage_page             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page'));
    v_usage_page_clr_Code    CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page_Colour_Code'));
    v_usage_section          CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section'));
    v_usage_sec_clr_code     CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section_Colour_Code'));
    v_usage_action           CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action'));
    v_usage_action_criteria  CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action_Criteria'));
    v_usage_api              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Api'));

    ------------------------------------------------------------------------------------------
    -- Local variables declaration
    ------------------------------------------------------------------------------------------
    v_get_claim_nos CLOB;
    v_claim_id      CLOB;
    v_days          NUMBER;
    v_date          VARCHAR2(10);
    v_ind           VARCHAR2(5) := 'N';

    -- V 1.1 Changes Begin
    v_limit           NUMBER  := TO_NUMBER(v_rows_perpage);
    v_offset          NUMBER  := v_limit * (TO_NUMBER(v_page_num)-1);
    v_rec_count       NUMBER;
    -- V 1.1 Changes End
    v_query1           CLOB; -- V 1.4 Changes

    ------------------------------------------------------------------------------------------
    -- Type declaration for search details
    ------------------------------------------------------------------------------------------
    TYPE clm_search_rec IS RECORD
    (
     claim_number            CLOB,
     claim_fact_key          CLOB,
     member_id               CLOB,
     member_first_name       CLOB,
     member_last_name        CLOB,
     member_dob              CLOB,
     patient_ssn             CLOB,
     check_number            CLOB,
     medicaid_id             CLOB,
     patient_name            CLOB,
     claim_status            CLOB,
     paid_to                 CLOB,
     claim_data_updated      CLOB,
     date_of_service         CLOB,
     claim_status_php        CLOB,
     total_amount_values     CLOB
    );

    TYPE clm_search_rec_type IS TABLE OF clm_search_rec INDEX BY PLS_INTEGER;
    v_clm_search_rec_type clm_search_rec_type;

  BEGIN
       ------------------------------------------------------------------------------------------
       -- Insert usage details into usage table : provider_connect_usage_tbl
       ------------------------------------------------------------------------------------------
       IF v_user_id IS NOT NULL THEN
          v_return_code := provider_connect_usage_pkg.provider_connect_usage_internal_insert_prc(v_user_id,
                                                                                                 v_user_name,
                                                                                                 v_user_role,
                                                                                                 v_user_tin,
                                                                                                 --v_user_npi,
                                                                                                 v_usage_page,
                                                                                                 v_usage_page_clr_Code,
                                                                                                 v_usage_section,
                                                                                                 v_usage_sec_clr_code,
                                                                                                 v_usage_action,
                                                                                                 v_usage_action_criteria,
                                                                                                 v_usage_api
                                                                                                );
       END IF;

       IF v_return_code <> 0 THEN
          RAISE v_program_error;
       END IF;
       ------------------------------------------------------------------------------------------
       -- To get number of days
       ------------------------------------------------------------------------------------------
       IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) THEN
           SELECT TO_DATE(v_end_date, 'YYYYMMDD') - TO_DATE(v_begin_date, 'YYYYMMDD') INTO v_days FROM DUAL;
       END IF;
       ------------------------------------------------------------------------------------------
       -- To check null input parameters
       ------------------------------------------------------------------------------------------
       IF ( v_claim_number     IS NULL AND
            v_begin_date       IS NULL AND
            v_end_date         IS NULL AND
            v_mem_member_id    IS NULL AND
            v_mem_first_name   IS NULL AND
            v_mem_last_name    IS NULL AND
            v_mem_dob          IS NULL AND
            v_patient_ssn      IS NULL AND
            v_mem_medicaid_id  IS NULL AND
            v_check_number     IS NULL AND
            v_prov_npi         IS NULL
           ) THEN
                v_response_obj.put('System_Code', '400');
                v_response_obj.put('System_Message', 'System could not find valid details .Please try again.');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
        ELSIF ((v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date > v_end_date)) OR (v_days > 93) THEN
                v_response_obj.put('System_Code', '400');
                v_response_obj.put('System_Message', 'You can select maximum 3 months of data and End date should be greater than begin date.Please try again.');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
        ELSIF (v_claim_number     IS NOT NULL   OR
               v_check_number     IS NOT NULL)  OR
              ((v_mem_member_id   IS NOT NULL   OR
                v_patient_ssn     IS NOT NULL   OR
                v_mem_medicaid_id IS NOT NULL)  AND
               (v_begin_date      IS NOT NULL   AND
                v_end_date        IS NOT NULL)) OR
              ((v_mem_first_name  IS NOT NULL   AND
                v_mem_last_name   IS NOT NULL   AND
                v_mem_dob         IS NOT NULL)  AND
               (v_begin_date      IS NOT NULL   AND
                v_end_date        IS NOT NULL)) OR
              (v_prov_npi         IS NOT NULL   AND
               v_begin_date       IS NOT NULL   AND
               v_end_date         IS NOT NULL)  THEN

              -- V 1.4 Changes Begin
              ------------------------------------------------------------------------------------------
              -- Split claim numbers
              ------------------------------------------------------------------------------------------
              IF v_claim_number IS NOT NULL THEN
                    v_get_claim_nos := get_claim_lists(v_claim_number);
                    v_claim_number := v_get_claim_nos;
              END IF;
              ------------------------------------------------------------------------------------------
              -- Assigning select statement into variable to fetch total count of records
              ------------------------------------------------------------------------------------------
              v_query1 := 'SELECT DISTINCT
                                  clm.claim_hcc_id                                                       AS claim_number,
                                  clm.claim_fact_key                                                     AS claim_fact_key
                             FROM claims_hub.hub_claims_medical clm
                             JOIN payors_hub.php_ees_master_tb ees
                               ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
              IF v_prov_tin IS NOT NULL THEN
                 v_query1 := v_query1 || 'JOIN claims_hub.hub_claims_to_provider prv
                                            ON prv.claim_fact_key = clm.claim_fact_key ';
              END IF;

              IF v_claim_number IS NOT NULL OR v_check_number IS NOT NULL THEN
                 IF v_claim_number IS NOT NULL THEN
                    v_query1 := v_query1 || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                  ELSE
                    v_query1 := v_query1 || 'WHERE (1=1 OR clm.claim_hcc_id IS NULL) ';
                 END IF;

                 IF v_check_number IS NOT NULL THEN
                    v_query1 := v_query1 || 'AND clm.check_number = '''|| v_check_number || ''' ';
                 END IF;

                 IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                    SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                  ELSE
                    SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                 END IF;
                 v_query1 := v_query1 || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';

               ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN

                     IF v_mem_member_id IS NOT NULL THEN
                        v_query1 := v_query1 || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                      ELSE
                        v_query1 := v_query1 || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                     END IF;

                     IF v_patient_ssn IS NOT NULL THEN
                        v_query1 := v_query1 || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                     END IF;

                     IF v_mem_medicaid_id IS NOT NULL THEN
                        v_query1 := v_query1 || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                     END IF;

               ELSIF (v_mem_first_name IS NOT NULL AND
                      v_mem_last_name  IS NOT NULL AND
                      v_mem_dob        IS NOT NULL ) THEN
                      v_query1 := v_query1 || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                      v_query1 := v_query1 || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                      v_query1 := v_query1 || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';
               ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                     v_query1 := v_query1 || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
              END IF;

              IF v_prov_tin IS NOT NULL THEN
                 v_query1 := v_query1 || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
              END IF;

              IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                  v_query1 := v_query1 || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                  v_query1 := v_query1 || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
              END IF;

              v_query1 := v_query1 || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
              v_query1 := v_query1 || ' AND clm.claim_line_status_code <> ''r'' ';
              v_query1 := v_query1 || ' AND ees.source = SUBSTR(clm.source,1,3) ';
              IF v_check_number IS NULL THEN
                 v_query1 := v_query1 || 'UNION
                                         SELECT DISTINCT
                                                clm.claim_hcc_id                                                       AS claim_number,
                                                clm.claim_fact_key                                                     AS claim_fact_key
                                           FROM claims_hub.hub_claims_medical_othsts clm
                                           JOIN payors_hub.php_ees_master_tb ees
                                             ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
                 IF v_prov_tin IS NOT NULL THEN
                    v_query1 := v_query1 || 'JOIN claims_hub.hub_claims_to_provider prv
                                               ON prv.claim_fact_key = clm.claim_fact_key ';
                 END IF;

                 IF v_claim_number IS NOT NULL  THEN
                    v_query1 := v_query1 || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                    IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                       SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                     ELSE
                       SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                    END IF;
                    v_query1 := v_query1 || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';
                  ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN
                        IF v_mem_member_id IS NOT NULL THEN
                           v_query1 := v_query1 || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                         ELSE
                           v_query1 := v_query1 || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                        END IF;

                        IF v_patient_ssn IS NOT NULL THEN
                           v_query1 := v_query1 || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                        END IF;

                        IF v_mem_medicaid_id IS NOT NULL THEN
                           v_query1 := v_query1 || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                        END IF;
                  ELSIF (v_mem_first_name IS NOT NULL AND
                         v_mem_last_name  IS NOT NULL AND
                         v_mem_dob        IS NOT NULL ) THEN
                         v_query1 := v_query1 || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                         v_query1 := v_query1 || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                         v_query1 := v_query1 || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';
                  ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                        v_query1 := v_query1 || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
                 END IF;

                 IF v_prov_tin IS NOT NULL THEN
                    v_query1 := v_query1 || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
                 END IF;

                 IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                     v_query1 := v_query1 || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                     v_query1 := v_query1 || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
                 END IF;

                 v_query1 := v_query1 || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
                 v_query1 := v_query1 || ' AND clm.claim_line_status_code <> ''r'' ';
                 v_query1 := v_query1 || ' AND ees.source = SUBSTR(clm.source,1,3) ';
                 --v_query1 := v_query1 || ' AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ';
              END IF;
              ------------------------------------------------------------------------------------------
              -- Select statement execution for total number of records and assign values into variable
              ------------------------------------------------------------------------------------------
              EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ( ' || v_query1 || ' )' INTO v_rec_count;

              IF v_rec_count > 0 THEN
              -- V 1.4 Changes End
                 ------------------------------------------------------------------------------------------
                 -- Assigning select statement into variable to fetch paginated data
                 ------------------------------------------------------------------------------------------
                 -- V 1.4 Changes Begin
                 v_query := 'SELECT *
                               FROM (
                 -- V 1.4 Changes End
                                     SELECT DISTINCT
                                            clm.claim_hcc_id                                                          AS claim_number,
                                            clm.claim_fact_key                                                        AS claim_fact_key,
                                            ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                            INITCAP(ees.meme_first_name)                                              AS member_first_name,
                                            INITCAP(ees.meme_last_name)                                               AS member_last_name,
                                            TO_CHAR(ees.meme_birth_dt,''MM/DD/YYYY'')                                 AS member_dob,
                                            ees.meme_ssn                                                              AS patient_ssn,
                                            clm.check_number                                                          AS check_number,
                                            ees.meme_medcd_no                                                         AS medicaid_id,
                                            INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                            || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                            clm.claim_status                                                          AS claim_status,
                                            ( SELECT INITCAP(prv1.provider_name)
                                                FROM claims_hub.hub_claims_to_provider prv1
                                               WHERE prv1.claim_fact_key = clm.claim_fact_key
                                                 AND prv1.provider_type = ''SUPPLIER''
                                            )                                                                         AS paid_to,
                                            TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                            (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                               TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                         WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                         WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                     END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                      MAX(clm1.svc_dt_end) AS svc_dt_end
                                                                 FROM claims_hub.hub_claims_medical clm1
                                                                WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                  AND clm1.claim_fact_key = clm.claim_fact_key
                                                                  AND clm1.claim_status_php <> ''Reversed''
                                                                  AND clm1.claim_line_status_code <> ''r''
                                             ))                                                                       AS date_of_service,
                                            clm.claim_status_php                                                      AS claim_status_php,
                                            (SELECT DISTINCT JSON_OBJECT (
                                                                          KEY ''Total_Charge'' VALUE SUM(clm2.billed_amount),
                                                                          KEY ''Paid_Amount''  VALUE SUM(clm2.paid_amount)
                                                                         )
                                               FROM claims_hub.hub_claims_medical clm2
                                              WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                                AND clm2.claim_fact_key = clm.claim_fact_key
                                                AND clm2.claim_status_php <> ''Reversed''
                                                AND (clm2.billed_amount IS NOT NULL OR clm2.paid_amount IS NOT NULL)
                                                AND clm2.claim_line_status_code <> ''r''
                                            )                                                                         AS total_amount_values
                                       FROM claims_hub.hub_claims_medical clm
                                       JOIN payors_hub.php_ees_master_tb ees
                                         ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
                 -- V 1.4 Changes Begin
                 IF v_prov_tin IS NOT NULL THEN
                    v_query := v_query || 'LEFT OUTER JOIN claims_hub.hub_claims_to_provider prv
                                                        ON prv.claim_fact_key = clm.claim_fact_key ';
                 END IF;
                 -- V 1.4 Changes End
                 -- V 1.2 Changes Begin
                  /*v_begin_date := SUBSTR(v_begin_date,1,6);
                    v_end_date   := SUBSTR(v_end_date,1,6);*/
                 -- V 1.2 Changes End

                 IF v_claim_number IS NOT NULL OR v_check_number IS NOT NULL THEN

                    IF v_claim_number IS NOT NULL THEN
                       -- V 1.4 Changes Begin
                       /*v_get_claim_nos := get_claim_lists(v_claim_number);
                         v_claim_number := v_get_claim_nos;*/
                       -- V 1.4 Changes End
                       v_query := v_query || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                     ELSE
                       v_query := v_query || 'WHERE (1=1 OR clm.claim_hcc_id IS NULL) ';
                    END IF;

                    IF v_check_number IS NOT NULL THEN
                       v_query := v_query || 'AND clm.check_number = '''|| v_check_number || ''' ';
                    END IF;

                    IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                       SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                     ELSE
                       SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                    END IF;
                    v_query := v_query || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';

                  ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN

                        IF v_mem_member_id IS NOT NULL THEN
                           v_query := v_query || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                         ELSE
                           v_query := v_query || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                        END IF;

                        IF v_patient_ssn IS NOT NULL THEN
                           v_query := v_query || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                        END IF;

                        IF v_mem_medicaid_id IS NOT NULL THEN
                           v_query := v_query || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                        END IF;

                  ELSIF (v_mem_first_name IS NOT NULL AND
                         v_mem_last_name  IS NOT NULL AND
                         v_mem_dob        IS NOT NULL ) THEN
                         v_query := v_query || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                         v_query := v_query || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                         v_query := v_query || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';
                  ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                        v_query := v_query || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
                 END IF;

                 IF v_prov_tin IS NOT NULL THEN
                    v_query := v_query || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
                 END IF;

                 IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                     -- V 1.2 Changes Begin
                     --v_query := v_query || 'AND clm.svc_dt_beg_yyyymm BETWEEN ''' || v_begin_date || ''' AND '''|| v_end_date ||''' ';
                     v_query := v_query || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                     v_query := v_query || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
                     -- V 1.2 Changes End
                 END IF;

                 v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
                 v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
                 v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';   -- V 1.3 Changes
                 -- V 1.4 Changes Begin
                 --v_query := v_query || ' ORDER BY clm.claim_hcc_id , clm.claim_fact_key ';
                 IF v_check_number IS NULL THEN
                    v_query := v_query || 'UNION
                                           SELECT DISTINCT
                                                  clm.claim_hcc_id                                                          AS claim_number,
                                                  clm.claim_fact_key                                                        AS claim_fact_key,
                                                  ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                                  INITCAP(ees.meme_first_name)                                              AS member_first_name,
                                                  INITCAP(ees.meme_last_name)                                               AS member_last_name,
                                                  TO_CHAR(ees.meme_birth_dt,''MM/DD/YYYY'')                                 AS member_dob,
                                                  ees.meme_ssn                                                              AS patient_ssn,
                                                  TO_NUMBER('''')                                                           AS check_number,
                                                  ees.meme_medcd_no                                                         AS medicaid_id,
                                                  INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                                  || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                                  clm.claim_status                                                          AS claim_status,
                                                  (SELECT INITCAP(prv1.supplier_name)
                                                     FROM claims_hub.hub_claims_to_supplier_othsts prv1
                                                    WHERE prv1.claim_fact_key = clm.claim_fact_key
                                                  )                                                                         AS paid_to,
                                                  TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                                  (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                                     TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                               WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                               WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                           END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                            MAX(clm1.svc_dt_end) AS svc_dt_end
                                                                       FROM claims_hub.hub_claims_medical_othsts clm1
                                                                      WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                        AND clm1.claim_fact_key = clm.claim_fact_key
                                                                        AND clm1.claim_status_php <> ''Reversed''
                                                                        AND clm1.claim_line_status_code <> ''r''
                                                   ))                                                                       AS date_of_service,
                                                  clm.claim_status_php                                                      AS claim_status_php,
                                                  (SELECT DISTINCT JSON_OBJECT (
                                                                                KEY ''Total_Charge'' VALUE SUM(clm2.billed_amount),
                                                                                KEY ''Paid_Amount''  VALUE SUM(clm2.paid_amount)
                                                                               )
                                                     FROM claims_hub.hub_claims_medical_othsts clm2
                                                    WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                                      AND clm2.claim_fact_key = clm.claim_fact_key
                                                      AND clm2.claim_status_php <> ''Reversed''
                                                      AND (clm2.billed_amount IS NOT NULL OR clm2.paid_amount IS NOT NULL)
                                                      AND clm2.claim_line_status_code <> ''r''
                                                  )                                                                         AS total_amount_values
                                             FROM claims_hub.hub_claims_medical_othsts clm
                                             JOIN payors_hub.php_ees_master_tb ees
                                               ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
                    -- V 1.4 Changes Begin
                    IF v_prov_tin IS NOT NULL THEN
                       v_query := v_query || 'LEFT OUTER JOIN claims_hub.hub_claims_to_provider prv
                                                           ON prv.claim_fact_key = clm.claim_fact_key ';
                    END IF;
                    -- V 1.2 Changes End

                    IF v_claim_number IS NOT NULL  THEN

                       v_query := v_query || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                       IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                          SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                        ELSE
                          SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                       END IF;
                       v_query := v_query || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';

                     ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN

                           IF v_mem_member_id IS NOT NULL THEN
                              v_query := v_query || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                            ELSE
                              v_query := v_query || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                           END IF;

                           IF v_patient_ssn IS NOT NULL THEN
                              v_query := v_query || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                           END IF;

                           IF v_mem_medicaid_id IS NOT NULL THEN
                              v_query := v_query || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                           END IF;

                     ELSIF (v_mem_first_name IS NOT NULL AND
                            v_mem_last_name  IS NOT NULL AND
                            v_mem_dob        IS NOT NULL ) THEN
                            v_query := v_query || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                            v_query := v_query || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                            v_query := v_query || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';
                     ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                           v_query := v_query || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
                    END IF;

                    IF v_prov_tin IS NOT NULL THEN
                       v_query := v_query || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
                    END IF;

                    IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                        v_query := v_query || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                        v_query := v_query || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
                    END IF;

                    v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
                    v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
                    v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';
                    --v_query := v_query || ' AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ';
                 END IF;
                 v_query := v_query || ' )ORDER BY claim_number,claim_fact_key ';
                 -- V 1.4 Changes End
                 -- V 1.1 Changes Begin
                 -- V 1.4 Changes Begin
                 /*------------------------------------------------------------------------------------------
                 -- Select statement execution for total number of records and assign values into variable
                 ------------------------------------------------------------------------------------------
                 EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ( ' || v_query || ' )' INTO v_rec_count;*/
                 -- V 1.4 Changes End

                 ------------------------------------------------------------------------------------------
                 -- Pagination logic
                 ------------------------------------------------------------------------------------------
                 IF (v_offset IS NULL OR v_limit IS NULL) THEN
                     v_query := v_query || ' OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY ';
                  ELSE
                      v_query := v_query || ' OFFSET ' || v_offset || ' ROWS FETCH NEXT ' || v_limit || ' ROWS ONLY ';
                 END IF;
                 -- V 1.1 Changes End

                 ------------------------------------------------------------------------------------------
                 -- Select statement execution and assign values into variable
                 ------------------------------------------------------------------------------------------
                 EXECUTE IMMEDIATE v_query BULK COLLECT INTO v_clm_search_rec_type;

                 ------------------------------------------------------------------------------------------
                 -- For loop to read values from variable and save into object
                 ------------------------------------------------------------------------------------------
                 FOR v_search_dtl IN 1 .. v_clm_search_rec_type.COUNT
                 LOOP
                     v_claims_search_obj := JSON_OBJECT_T();
                     v_claims_search_obj.put('Claim_Number'           , v_clm_search_rec_type (v_search_dtl).claim_number         );
                     v_claims_search_obj.put('Claim_Fact_Key'         , v_clm_search_rec_type (v_search_dtl).claim_fact_key       );
                     v_claims_search_obj.put('Member_Id'              , v_clm_search_rec_type (v_search_dtl).member_id            );
                     v_claims_search_obj.put('Member_First_Name'      , v_clm_search_rec_type (v_search_dtl).member_first_name    );
                     v_claims_search_obj.put('Member_Last_Name'       , v_clm_search_rec_type (v_search_dtl).member_last_name     );
                     v_claims_search_obj.put('Member_Dob'             , v_clm_search_rec_type (v_search_dtl).member_dob           );
                     v_claims_search_obj.put('Patient_Ssn'            , v_clm_search_rec_type (v_search_dtl).patient_ssn          );
                     v_claims_search_obj.put('Check_Number'           , v_clm_search_rec_type (v_search_dtl).check_number         );
                     v_claims_search_obj.put('Medicaid_Id'            , v_clm_search_rec_type (v_search_dtl).medicaid_id          );
                     v_claims_search_obj.put('Patient_Name'           , v_clm_search_rec_type (v_search_dtl).patient_name         );
                     v_claims_search_obj.put('Claim_Status'           , v_clm_search_rec_type (v_search_dtl).claim_status         );
                     v_claims_search_obj.put('Paid_To'                , v_clm_search_rec_type (v_search_dtl).paid_to              );
                     v_claims_search_obj.put('Claim_Data_Updated'     , v_clm_search_rec_type (v_search_dtl).claim_data_updated   );
                     v_claims_search_obj.put('Date_Of_Service'        , v_clm_search_rec_type (v_search_dtl).date_of_service      );
                     v_claims_search_obj.put('Claim_Status_Php'       , v_clm_search_rec_type (v_search_dtl).claim_status_php     );
                     v_claims_search_obj.put('Total_Amount_Values'    , v_clm_search_rec_type (v_search_dtl).total_amount_values  );

                     v_claims_search_ary.append(v_claims_search_obj);
                     v_ind := 'Y';
                 END LOOP;
              -- V 1.4 Changes Begin
               ELSE
                   v_ind := 'N';
              END IF;
              -- V 1.4 Changes End

              ------------------------------------------------------------------------------------------
              -- Save values into response object and assign into response variable
              ------------------------------------------------------------------------------------------
              IF v_ind = 'Y' THEN
                 v_response_obj.put('Claims_Search_Details', v_claims_search_ary);
                 -- V 1.1 Changes Begin
                 v_response_obj.put('Total_Count', v_rec_count);
                 v_response_obj.put('Page_Number', v_page_num);
                 -- V 1.1 Changes End
                 v_response_obj.put('System_Code', '200');
                 v_response_obj.put('System_Message', 'Claim(s) found');
                 v_response_obj.put('Status', 'Success');
                 v_response := v_response_obj.to_clob;
               ELSE
                  v_response_obj.put('Claims_Search_Details', v_claims_search_ary);
                  v_response_obj.put('System_Code', '204');
                  v_response_obj.put('System_Message', 'Claim(s) not found');
                  v_response_obj.put('Status', 'Success');
                  v_response := v_response_obj.to_clob;
              END IF;
        ELSE
            v_response_obj.put('System_Code', '400');
            v_response_obj.put('System_Message', 'System could not find valid details .Please try again.');
            v_response_obj.put('Status', 'Success');
            v_response := v_response_obj.to_clob;
       END IF;

       ------------------------------------------------------------------------------------------
       -- Exception Handling
       ------------------------------------------------------------------------------------------
       EXCEPTION
                WHEN v_program_error THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;

                WHEN OTHERS THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;
      COMMIT;
  END provider_connect_claim_search_prc;
  /*******************************************************************************************************************/

  /********************************************************************************************************************
  ** NAME                 : provider_connect_claim_summary_get_prc                                                   **
  **                                                                                                                 **
  ** VERSION              : 1.2                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To get claim summary details for claims search                                           **
  **                                                                                                                 **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : JSONIN CLOB                                                                              **
  **               OUTPUT : Response with Data base result-set                                                       **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 05/09/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                     **
  * 1.1            | 05/08/2024   | Cognizant  | Added source condition to remove duplicate patient information under**
  *                                              the same claim numbers                                              **
  * 1.2            | 05/09/2024   | Cognizant  | Logic to include pended claims                                      **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_claim_summary_get_prc (v_jsonIn IN CLOB,v_response OUT CLOB)
  AS
    /***********************
    {
     "UserProfile":
     {
     },
     "Filter":
     {
     },
     "Offset":"",
     "Limit":""
    }
    ************************/
    ------------------------------------------------------------------------------------------
    -- Initializing variables for json objects / arrays
    ------------------------------------------------------------------------------------------
    v_jsonObj                   JSON_OBJECT_T  := JSON_OBJECT_T.parse(v_jsonIn);
    v_claims_sum_obj            JSON_OBJECT_T;
    v_claims_sum_ary            JSON_ARRAY_T   := JSON_ARRAY_T ();
    v_response_obj              JSON_OBJECT_T  := JSON_OBJECT_T();
    ------------------------------------------------------------------------------------------
    -- Initializing variables for input parameters
    ------------------------------------------------------------------------------------------
    v_claim_number    VARCHAR2(30)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Number'));
    v_claim_fact_key  VARCHAR2(50)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Fact_Key'));

    ------------------------------------------------------------------------------------------
    -- Initializing variables for user profile
    ------------------------------------------------------------------------------------------
    v_user_id                CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Id'));
    v_user_name              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Name'));
    v_user_role              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Role'));
    v_user_tin               CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Tin'));
    --v_user_npi             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Npi'));
    v_usage_page             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page'));
    v_usage_page_clr_Code    CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page_Colour_Code'));
    v_usage_section          CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section'));
    v_usage_sec_clr_code     CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section_Colour_Code'));
    v_usage_action           CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action'));
    v_usage_action_criteria  CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action_Criteria'));
    v_usage_api              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Api'));

    ------------------------------------------------------------------------------------------
    -- Local variables declaration
    ------------------------------------------------------------------------------------------
    v_ind VARCHAR2(5) := 'N';

    ------------------------------------------------------------------------------------------
    -- Type declaration for claim summary details
    ------------------------------------------------------------------------------------------
    TYPE clm_sum_rec IS RECORD
    (
     claim_number            CLOB,
     member_id               CLOB,
     patient_name            CLOB,
     claim_status            CLOB,
     group_id                CLOB,
     group_name              CLOB,
     subscriber_name         CLOB,
     patient_account_number  CLOB,
     servicing_provider      CLOB,
     date_claim_was_received CLOB,
     claim_data_updated      CLOB,
     date_of_service         CLOB

    );

    TYPE clm_sum_rec_type IS TABLE OF clm_sum_rec INDEX BY PLS_INTEGER;
    v_clm_sum_rec_type clm_sum_rec_type;

  BEGIN
       ------------------------------------------------------------------------------------------
       -- Insert usage details into usage table : provider_connect_usage_tbl
       ------------------------------------------------------------------------------------------
       IF v_user_id IS NOT NULL THEN
          v_return_code := provider_connect_usage_pkg.provider_connect_usage_internal_insert_prc(v_user_id,
                                                                                                 v_user_name,
                                                                                                 v_user_role,
                                                                                                 v_user_tin,
                                                                                                 --v_user_npi,
                                                                                                 v_usage_page,
                                                                                                 v_usage_page_clr_Code,
                                                                                                 v_usage_section,
                                                                                                 v_usage_sec_clr_code,
                                                                                                 v_usage_action,
                                                                                                 v_usage_action_criteria,
                                                                                                 v_usage_api
                                                                                                );
       END IF;

       IF v_return_code <> 0 THEN
          RAISE v_program_error;
       END IF;

       ------------------------------------------------------------------------------------------
       -- To check null input parameters
       ------------------------------------------------------------------------------------------
       IF ( v_claim_number IS NULL OR v_claim_fact_key IS NULL ) THEN
            v_response_obj.put('System_Code', '400');
            v_response_obj.put('System_Message', 'System could not find valid details .Please try again.');
            v_response_obj.put('Status', 'Success');
            v_response := v_response_obj.to_clob;
        ELSE
            ------------------------------------------------------------------------------------------
            -- Assigning select statement into variable
            ------------------------------------------------------------------------------------------
            -- V 1.2 Changes Begin
            v_query := 'SELECT *
                          FROM (
            -- V 1.2 Changes End
                                 SELECT DISTINCT
                                        clm.claim_hcc_id                                                          AS claim_number,
                                        ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                        INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                        || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                        clm.claim_status                                                          AS claim_status,
                                        ees.grgr_id                                                               AS group_id,
                                        INITCAP(ees.grgr_name)                                                    AS group_name,
                                        INITCAP(ees.sbsb_last_name || '' '' || ees.sbsb_first_name
                                        || '' '' || ees.sbsb_mid_init)                                            AS subscriber_name,
                                        clm.patient_account_number                                                AS patient_account_number,
                                        (SELECT INITCAP(prv2.provider_name)
                                           FROM claims_hub.hub_claims_to_provider prv2
                                          WHERE prv2.claim_fact_key = clm.claim_fact_key
                                            AND prv2.provider_type = ''RENDERING PROVIDER HEADER''
                                        )                                                                         AS servicing_provider,
                                        TO_CHAR(clm.receipt_dt,''MM/DD/YYYY'')                                    AS date_claim_was_received,
                                        TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                        (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                           TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                     WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                     WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                 END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                  MAX(clm1.svc_dt_end) AS svc_dt_end
                                                             FROM claims_hub.hub_claims_medical clm1
                                                            WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                              AND clm1.claim_fact_key = clm.claim_fact_key
                                                              AND clm1.claim_status_php <> ''Reversed''
                                                              AND clm1.claim_line_status_code <> ''r''
                                         ))                                                                       AS date_of_service
                                   FROM claims_hub.hub_claims_medical clm
                                   JOIN payors_hub.php_ees_master_tb ees
                                     ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';

            v_query := v_query || ' WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key || ''' ';
            v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
            v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
            v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';   -- V 1.1 Changes
            -- V 1.2 Changes Begin
            --v_query := v_query || ' ORDER BY clm.claim_hcc_id ';

            v_query := v_query || 'UNION
                                   SELECT DISTINCT
                                          clm.claim_hcc_id                                                          AS claim_number,
                                          ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                          INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                          || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                          clm.claim_status                                                          AS claim_status,
                                          ees.grgr_id                                                               AS group_id,
                                          INITCAP(ees.grgr_name)                                                    AS group_name,
                                          INITCAP(ees.sbsb_last_name || '' '' || ees.sbsb_first_name
                                          || '' '' || ees.sbsb_mid_init)                                            AS subscriber_name,
                                          clm.patient_account_number                                                AS patient_account_number,
                                          (SELECT INITCAP(prv2.rendering_last_name
                                                  || '' '' || prv2.rendering_first_name
                                                  || '' '' || prv2. rendering_mid_name)
                                             FROM claims_hub.hub_claims_to_practitioner_othsts prv2
                                            WHERE prv2.claim_fact_key = clm.claim_fact_key
                                          )                                                                         AS servicing_provider,
                                          TO_CHAR(clm.receipt_dt,''MM/DD/YYYY'')                                    AS date_claim_was_received,
                                          TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                          (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                             TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                       WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                       WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                   END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                    MAX(clm1.svc_dt_end) AS svc_dt_end
                                                               FROM claims_hub.hub_claims_medical_othsts clm1
                                                              WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                AND clm1.claim_fact_key = clm.claim_fact_key
                                                                AND clm1.claim_status_php <> ''Reversed''
                                                                AND clm1.claim_line_status_code <> ''r''
                                          ))                                                                       AS date_of_service
                                     FROM claims_hub.hub_claims_medical_othsts clm
                                     JOIN payors_hub.php_ees_master_tb ees
                                       ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';

            v_query := v_query || ' WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key || ''' ';
            v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
            v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
            v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';
            --v_query := v_query || ' AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ';
            v_query := v_query || ' )ORDER BY claim_number ';
            -- V 1.2 Changes End
            ------------------------------------------------------------------------------------------
            -- Select statement execution and assign values into variable
            ------------------------------------------------------------------------------------------
            EXECUTE IMMEDIATE v_query BULK COLLECT INTO v_clm_sum_rec_type;

            ------------------------------------------------------------------------------------------
            -- For loop to read values from variable and save into object
            ------------------------------------------------------------------------------------------
            FOR v_clm_dtl IN 1 .. v_clm_sum_rec_type.COUNT
            LOOP
                v_claims_sum_obj := JSON_OBJECT_T();
                v_claims_sum_obj.put('Claim_Number'           , v_clm_sum_rec_type (v_clm_dtl).claim_number           );
                v_claims_sum_obj.put('Member_Id'              , v_clm_sum_rec_type (v_clm_dtl).member_id              );
                v_claims_sum_obj.put('Patient_Name'           , v_clm_sum_rec_type (v_clm_dtl).patient_name           );
                v_claims_sum_obj.put('Claim_Status'           , v_clm_sum_rec_type (v_clm_dtl).claim_status           );
                v_claims_sum_obj.put('Group_Id'               , v_clm_sum_rec_type (v_clm_dtl).group_id               );
                v_claims_sum_obj.put('Group_Name'             , v_clm_sum_rec_type (v_clm_dtl).group_name             );
                v_claims_sum_obj.put('Subscriber_Name'        , v_clm_sum_rec_type (v_clm_dtl).subscriber_name        );
                v_claims_sum_obj.put('Patient_Account_Number' , v_clm_sum_rec_type (v_clm_dtl).patient_account_number );
                v_claims_sum_obj.put('Servicing_Provider'     , v_clm_sum_rec_type (v_clm_dtl).servicing_provider     );
                v_claims_sum_obj.put('Date_Claim_Was_Received', v_clm_sum_rec_type (v_clm_dtl).date_claim_was_received);
                v_claims_sum_obj.put('Claim_Data_Updated'     , v_clm_sum_rec_type (v_clm_dtl).claim_data_updated     );
                v_claims_sum_obj.put('Date_Of_Service'        , v_clm_sum_rec_type (v_clm_dtl).date_of_service        );

                v_claims_sum_ary.append(v_claims_sum_obj);
                 v_ind := 'Y';
             END LOOP;

             ------------------------------------------------------------------------------------------
             -- Save values into response object and assign into response variable
             ------------------------------------------------------------------------------------------
             IF v_ind = 'Y' THEN
                v_response_obj.put('Claims_Summary_Details', v_claims_sum_ary);
                v_response_obj.put('System_Code', '200');
                v_response_obj.put('System_Message', 'Claim summary details found');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
              ELSE
                 v_response_obj.put('Summary', v_claims_sum_ary);
                 v_response_obj.put('System_Code', '204');
                v_response_obj.put('System_Message', 'Claim summary details not found');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
             END IF;
       END IF;

       ------------------------------------------------------------------------------------------
       -- Exception Handling
       ------------------------------------------------------------------------------------------
       EXCEPTION
                WHEN v_program_error THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;

                WHEN OTHERS THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;
      COMMIT;
  END provider_connect_claim_summary_get_prc;
  /*******************************************************************************************************************/

  /********************************************************************************************************************
  ** NAME                 : provider_connect_payment_details_get_prc                                                 **
  **                                                                                                                 **
  ** VERSION              : 1.1                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To get claim payment details for claims search                                           **
  **                                                                                                                 **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : JSONIN CLOB                                                                              **
  **               OUTPUT : Response with Data base result-set                                                       **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 05/07/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                     **
  * 1.1            | 05/07/2024   | Cognizant  | Logic to include pended claims                                      **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_payment_details_get_prc (v_jsonIn IN CLOB,v_response OUT CLOB)
  AS
    /***********************
    {
     "UserProfile":
     {
     },
     "Filter":
     {
     },
     "Offset":"",
     "Limit":""
    }
    ************************/
    ------------------------------------------------------------------------------------------
    -- Initializing variables for json objects / arrays
    ------------------------------------------------------------------------------------------
    v_jsonObj                   JSON_OBJECT_T  := JSON_OBJECT_T.parse(v_jsonIn);
    v_payment_dtl_obj           JSON_OBJECT_T;
    v_payment_dtl_ary           JSON_ARRAY_T   := JSON_ARRAY_T ();
    v_response_obj              JSON_OBJECT_T  := JSON_OBJECT_T();
    ------------------------------------------------------------------------------------------
    -- Initializing variables for input parameters
    ------------------------------------------------------------------------------------------
    v_claim_number    VARCHAR2(30)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Number'));
    v_claim_fact_key  VARCHAR2(50)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Fact_Key'));
    ------------------------------------------------------------------------------------------
    -- Initializing variables for user profile
    ------------------------------------------------------------------------------------------
    v_user_id                CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Id'));
    v_user_name              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Name'));
    v_user_role              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Role'));
    v_user_tin               CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Tin'));
    --v_user_npi             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Npi'));
    v_usage_page             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page'));
    v_usage_page_clr_Code    CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page_Colour_Code'));
    v_usage_section          CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section'));
    v_usage_sec_clr_code     CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section_Colour_Code'));
    v_usage_action           CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action'));
    v_usage_action_criteria  CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action_Criteria'));
    v_usage_api              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Api'));

    ------------------------------------------------------------------------------------------
    -- Local variables declaration
    ------------------------------------------------------------------------------------------
    v_ind VARCHAR2(5) := 'N';

    ------------------------------------------------------------------------------------------
    -- Type declaration for payment details
    ------------------------------------------------------------------------------------------
    TYPE payment_dtl_rec IS RECORD
    (
     claim_number            CLOB,
     check_number            CLOB,
     date_claim_was_paid_on  CLOB,
     claims_payment_made_to  CLOB,
     total_amount_values     CLOB,
     total_check_amount      CLOB,
     payment_status_desc     CLOB
    );

    TYPE payment_dtl_rec_type IS TABLE OF payment_dtl_rec INDEX BY PLS_INTEGER;
    v_payment_dtl_rec_type payment_dtl_rec_type;

  BEGIN
       ------------------------------------------------------------------------------------------
       -- Insert usage details into usage table : provider_connect_usage_tbl
       ------------------------------------------------------------------------------------------
       IF v_user_id IS NOT NULL THEN
          v_return_code := provider_connect_usage_pkg.provider_connect_usage_internal_insert_prc(v_user_id,
                                                                                                 v_user_name,
                                                                                                 v_user_role,
                                                                                                 v_user_tin,
                                                                                                 --v_user_npi,
                                                                                                 v_usage_page,
                                                                                                 v_usage_page_clr_Code,
                                                                                                 v_usage_section,
                                                                                                 v_usage_sec_clr_code,
                                                                                                 v_usage_action,
                                                                                                 v_usage_action_criteria,
                                                                                                 v_usage_api
                                                                                                );
       END IF;

       IF v_return_code <> 0 THEN
          RAISE v_program_error;
       END IF;

       ------------------------------------------------------------------------------------------
       -- To check null input parameters
       ------------------------------------------------------------------------------------------
       IF ( v_claim_number IS NULL OR v_claim_fact_key IS NULL ) THEN
            v_response_obj.put('System_Code', '400');
            v_response_obj.put('System_Message', 'System could not find valid details .Please try again.');
            v_response_obj.put('Status', 'Success');
            v_response := v_response_obj.to_clob;
        ELSE
            ------------------------------------------------------------------------------------------
            -- Assigning select statement into variable
            ------------------------------------------------------------------------------------------
            -- V 1.1 Changes Begin
            v_query := 'SELECT *
                          FROM(
            -- V 1.1 Changes End
                               SELECT DISTINCT
                               clm.claim_hcc_id                                                       AS claim_number,
                               clm.check_number                                                       AS check_number,
                               TO_CHAR(clm.paid_dt,''MM/DD/YYYY'')                                    AS date_claim_was_paid_on,
                               (SELECT INITCAP(prv1.provider_name)
                                  FROM claims_hub.hub_claims_to_provider prv1
                                 WHERE prv1.claim_fact_key = clm.claim_fact_key
                                   AND prv1.provider_type = ''SUPPLIER''
                               )                                                                      AS claims_payment_made_to,
                               (SELECT DISTINCT JSON_OBJECT (
                                                             KEY ''Total_Charge'' VALUE SUM(clm2.billed_amount),
                                                             KEY ''Paid_Amount''  VALUE SUM(clm2.paid_amount)
                                                            )
                                  FROM claims_hub.hub_claims_medical clm2
                                 WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                   AND clm2.claim_fact_key = clm.claim_fact_key
                                   AND clm2.claim_status_php <> ''Reversed''
                                   AND (clm2.billed_amount IS NOT NULL OR clm2.paid_amount IS NOT NULL)
                                   AND clm2.claim_line_status_code <> ''r''
                               )                                                                      AS total_amount_values,
                               CASE WHEN clm.total_check_amount IS NOT NULL THEN
                                         ''$'' || clm.total_check_amount
                               END                                                                    AS total_check_amount,
                               clm.payment_status_desc                                                AS payment_status_desc
                          FROM claims_hub.hub_claims_medical clm ';

            v_query := v_query || ' WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key || ''' ';
            v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' ';
            v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
            -- V 1.1 Changes Begin
            --v_query := v_query || ' ORDER BY clm.claim_hcc_id ';

            v_query := v_query || 'UNION
                                   SELECT DISTINCT
                                          clm.claim_hcc_id                                                          AS claim_number,
                                          TO_NUMBER('''')                                                           AS check_number,
                                          TO_CHAR(clm.paid_dt,''MM/DD/YYYY'')                                       AS date_claim_was_paid_on,
                                          (SELECT INITCAP(prv1.supplier_name)
                                               FROM claims_hub.hub_claims_to_supplier_othsts prv1
                                              WHERE prv1.claim_fact_key = clm.claim_fact_key
                                           )                                                                        AS claims_payment_made_to,
                                          (SELECT DISTINCT JSON_OBJECT (
                                                                        KEY ''Total_Charge'' VALUE SUM(clm2.billed_amount),
                                                                        KEY ''Paid_Amount''  VALUE SUM(clm2.paid_amount)
                                                                       )
                                             FROM claims_hub.hub_claims_medical_othsts clm2
                                            WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                              AND clm2.claim_fact_key = clm.claim_fact_key
                                              AND clm2.claim_status_php <> ''Reversed''
                                              AND (clm2.billed_amount IS NOT NULL OR clm2.paid_amount IS NOT NULL)
                                              AND clm2.claim_line_status_code <> ''r''
                                          )                                                                         AS total_amount_values,
                                          ''''                                                                      AS total_check_amount,
                                          ''''                                                                      AS payment_status_desc
                                     FROM claims_hub.hub_claims_medical_othsts clm ';

            v_query := v_query || ' WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key || ''' ';
            v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' ';
            v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
            --v_query := v_query || ' AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ';
            v_query := v_query || ' )ORDER BY claim_number ';
            -- V 1.1 Changes End
            ------------------------------------------------------------------------------------------
            -- Select statement execution and assign values into variable
            ------------------------------------------------------------------------------------------
            EXECUTE IMMEDIATE v_query BULK COLLECT INTO v_payment_dtl_rec_type;

            ------------------------------------------------------------------------------------------
            -- For loop to read values from variable and save into object
            ------------------------------------------------------------------------------------------
            FOR v_payment_dtl IN 1 .. v_payment_dtl_rec_type.COUNT
            LOOP
                v_payment_dtl_obj := JSON_OBJECT_T();
                v_payment_dtl_obj.put('Claim_Number'           , v_payment_dtl_rec_type (v_payment_dtl).claim_number           );
                v_payment_dtl_obj.put('Check_Number'           , v_payment_dtl_rec_type (v_payment_dtl).check_number           );
                v_payment_dtl_obj.put('Date_Claim_Was_Paid_On' , v_payment_dtl_rec_type (v_payment_dtl).date_claim_was_paid_on );
                v_payment_dtl_obj.put('Claims_Payment_Made_To' , v_payment_dtl_rec_type (v_payment_dtl).claims_payment_made_to );
                v_payment_dtl_obj.put('Total_Amount_Values'    , v_payment_dtl_rec_type (v_payment_dtl).total_amount_values    );
                v_payment_dtl_obj.put('Total_Check_Amount'     , v_payment_dtl_rec_type (v_payment_dtl).total_check_amount     );
                v_payment_dtl_obj.put('Payment_Status_Desc'    , v_payment_dtl_rec_type (v_payment_dtl).payment_status_desc    );

                v_payment_dtl_ary.append(v_payment_dtl_obj);
                 v_ind := 'Y';
             END LOOP;

             ------------------------------------------------------------------------------------------
             -- Save values into response object and assign into response variable
             ------------------------------------------------------------------------------------------
             IF v_ind = 'Y' THEN
                v_response_obj.put('Payment_Details', v_payment_dtl_ary);
                v_response_obj.put('System_Code', '200');
                v_response_obj.put('System_Message', 'Claim Payment details found');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
              ELSE
                 v_response_obj.put('Payment_Details', v_payment_dtl_ary);
                 v_response_obj.put('System_Code', '204');
                 v_response_obj.put('System_Message', 'Claim Payment details not found');
                 v_response_obj.put('Status', 'Success');
                 v_response := v_response_obj.to_clob;
             END IF;
       END IF;

       ------------------------------------------------------------------------------------------
       -- Exception Handling
       ------------------------------------------------------------------------------------------
       EXCEPTION
                WHEN v_program_error THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;

                WHEN OTHERS THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;
      COMMIT;
  END provider_connect_payment_details_get_prc;
  /*******************************************************************************************************************/

  /********************************************************************************************************************
  ** NAME                 : provider_connect_claim_line_details_get_prc                                              **
  **                                                                                                                 **
  ** VERSION              : 1.2                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To get claim line details for claims search details for claims summary UI screen         **
  **                                                                                                                 **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : JSONIN CLOB                                                                              **
  **               OUTPUT : Response with Data base result-set                                                       **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 05/10/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                     **
  * 1.1            | 05/07/2024   | Cognizant  | Logic to include pended claims                                      **
  * 1.2            | 05/10/2024   | Cognizant  | Pagination changes for claim lines                                  **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_claim_line_details_get_prc (v_jsonIn IN CLOB,v_response OUT CLOB)
  AS
    /***********************
    {
     "UserProfile":
     {
     },
     "Filter":
     {
     },
     "Offset":"",
     "Limit":""
    }
    ************************/
    ------------------------------------------------------------------------------------------
    -- Initializing variables for json objects / arrays
    ------------------------------------------------------------------------------------------
    v_jsonObj                   JSON_OBJECT_T  := JSON_OBJECT_T.parse(v_jsonIn);
    v_claim_line_obj            JSON_OBJECT_T;
    v_claim_line_ary            JSON_ARRAY_T   := JSON_ARRAY_T ();
    v_response_obj              JSON_OBJECT_T  := JSON_OBJECT_T();
    ------------------------------------------------------------------------------------------
    -- Initializing variables for input parameters
    ------------------------------------------------------------------------------------------
    v_claim_number    VARCHAR2(30)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Number'));
    v_claim_fact_key  VARCHAR2(50)  := TRIM(v_jsonObj.get_Object('Filter').get_String('Claim_Fact_Key'));
    -- V 1.2 Changes Begin
    v_rows_perpage    CLOB          := TRIM(v_jsonObj.get_Object('Filter').get_String('Rows_Per_Page'));
    v_page_num        CLOB          := TRIM(v_jsonObj.get_Object('Filter').get_String('Page_Number'));
    -- V 1.2 Changes End

    ------------------------------------------------------------------------------------------
    -- Initializing variables for user profile
    ------------------------------------------------------------------------------------------
    v_user_id                CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Id'));
    v_user_name              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Name'));
    v_user_role              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Role'));
    v_user_tin               CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Tin'));
    --v_user_npi             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('User_Npi'));
    v_usage_page             CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page'));
    v_usage_page_clr_Code    CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Page_Colour_Code'));
    v_usage_section          CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section'));
    v_usage_sec_clr_code     CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Section_Colour_Code'));
    v_usage_action           CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action'));
    v_usage_action_criteria  CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Action_Criteria'));
    v_usage_api              CLOB := TRIM(v_jsonObj.get_Object('UserProfile').get_String('Usage_Api'));

    ------------------------------------------------------------------------------------------
    -- Local variables declaration
    ------------------------------------------------------------------------------------------
    v_ind VARCHAR2(5) := 'N';
    -- V 1.2 Changes Begin
    v_query1           CLOB;
    v_limit           NUMBER  := TO_NUMBER(v_rows_perpage);
    v_offset          NUMBER  := v_limit * (TO_NUMBER(v_page_num)-1);
    v_rec_count       NUMBER;
    -- V 1.2 Changes End

    ------------------------------------------------------------------------------------------
    -- Type declaration for claim line details
    ------------------------------------------------------------------------------------------
    TYPE claim_line_rec IS RECORD
    (
     claim_number          CLOB,
     claim_fact_key        CLOB,
     claim_line_fact_key   CLOB,
     item_number           CLOB,
     procedure_code        CLOB,
     diagnosis_code        CLOB,
     claim_code            CLOB,
     units                 CLOB,
     charges               CLOB,
     allowed               CLOB,
     deductible            CLOB,
     coinsurance           CLOB,
     plan_paid             CLOB,
     network               CLOB,
     cap_no_cap            CLOB,
     total                 CLOB,
     rarc_carc             CLOB,
     copay                 CLOB
     );

    TYPE claim_line_rec_type IS TABLE OF claim_line_rec INDEX BY PLS_INTEGER;
    v_claim_line_rec_type claim_line_rec_type;

  BEGIN
       ------------------------------------------------------------------------------------------
       -- Insert usage details into usage table : provider_connect_usage_tbl
       ------------------------------------------------------------------------------------------
       IF v_user_id IS NOT NULL THEN
          v_return_code := provider_connect_usage_pkg.provider_connect_usage_internal_insert_prc(v_user_id,
                                                                                                 v_user_name,
                                                                                                 v_user_role,
                                                                                                 v_user_tin,
                                                                                                 --v_user_npi,
                                                                                                 v_usage_page,
                                                                                                 v_usage_page_clr_Code,
                                                                                                 v_usage_section,
                                                                                                 v_usage_sec_clr_code,
                                                                                                 v_usage_action,
                                                                                                 v_usage_action_criteria,
                                                                                                 v_usage_api
                                                                                                );
       END IF;

       IF v_return_code <> 0 THEN
          RAISE v_program_error;
       END IF;

       ------------------------------------------------------------------------------------------
       -- To check null input parameters
       ------------------------------------------------------------------------------------------
       IF ( v_claim_number IS NULL OR v_claim_fact_key IS NULL ) THEN
            v_response_obj.put('System_Code', '400');
            v_response_obj.put('System_Message', 'System could not find valid details .Please try again.');
            v_response_obj.put('Status', 'Success');
            v_response := v_response_obj.to_clob;
        ELSE
            -- V 1.2 Changes Begin
            ------------------------------------------------------------------------------------------
            -- Assigning select statement into variable to fetch count of total records
            ------------------------------------------------------------------------------------------
            v_query1 := 'SELECT DISTINCT
                                clm.claim_hcc_id                                                 AS claim_number,
                                clm.claim_fact_key                                               AS claim_fact_key,
                                clm.claim_line_fact_key                                          AS claim_line_fact_key,
                                TO_NUMBER(clm.original_line_number)                              AS original_line_number
                           FROM claims_hub.hub_claims_medical clm ';

            v_query1 := v_query1 || 'WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key ||''' ';
            v_query1 := v_query1 || 'AND clm.claim_status_php <> ''Reversed'' ';
            v_query1 := v_query1 || 'AND clm.claim_line_status_code <> ''r'' ';
            v_query1 := v_query1 || 'UNION
                                     SELECT DISTINCT
                                            clm.claim_hcc_id                                                 AS claim_number,
                                            clm.claim_fact_key                                               AS claim_fact_key,
                                            clm.claim_line_fact_key                                          AS claim_line_fact_key,
                                            TO_NUMBER(clm.original_line_number)                              AS orig_line_number
                                       FROM claims_hub.hub_claims_medical_othsts clm ';

            v_query1 := v_query1 || 'WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key ||''' ';
            v_query1 := v_query1 || 'AND clm.claim_status_php <> ''Reversed'' ';
            v_query1 := v_query1 || 'AND clm.claim_line_status_code <> ''r'' ';
            --v_query1 := v_query1 || 'AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ';

            ------------------------------------------------------------------------------------------
            -- Select statement execution for total number of records and assign values into variable
            ------------------------------------------------------------------------------------------
            EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ( ' || v_query1 || ' )' INTO v_rec_count;

            IF v_rec_count > 0 THEN
            -- V 1.2 Changes End
               ------------------------------------------------------------------------------------------
               -- Assigning select statement into variable to fetch paginated records
               ------------------------------------------------------------------------------------------
               -- V 1.1 Changes Begin
               v_query := 'SELECT *
                             FROM (
               -- V 1.1 Changes End
                               SELECT Claim_Number                                                        AS claim_number,
                                      Claim_fact_key                                                      AS claim_fact_key,
                                      Claim_line_fact_key                                                 AS claim_line_fact_key,
                                      ROW_NUMBER() OVER (PARTITION BY claim_fact_key
                                                             ORDER BY TO_NUMBER(original_line_number),
                                                                      TO_NUMBER(claim_line_fact_key) ASC) AS item_number,
                                      Procedure_Code                                                      AS procedure_code,
                                      Diagnosis_Code                                                      AS diagnosis_code,
                                      Claim_Code                                                          AS claim_code,
                                      Units                                                               AS units,
                                      Charges                                                             AS charges,
                                      Allowed                                                             AS allowed,
                                      Deductible                                                          AS deductible,
                                      Coinsurance                                                         AS coinsurance,
                                      Plan_Paid                                                           AS plan_paid,
                                      Network                                                             AS network,
                                      Cap_No_Cap                                                          AS cap_no_cap,
                                      Total                                                               AS total,
                                      Rarc_Carc                                                           AS rarc_carc,
                                      Copay                                                               AS copay
                                      FROM (
                                            SELECT DISTINCT
                                                   clm.claim_hcc_id                                                 AS Claim_Number,
                                                   clm.claim_fact_key                                               AS Claim_fact_key,
                                                   clm.claim_line_fact_key                                          AS Claim_line_fact_key,
                                                   clm.claim_line_hcc_id                                            AS Item_Number,
                                                   clm.original_line_number                                         AS Original_line_number,
                                                   (SELECT JSON_ARRAYAGG
                                                                (
                                                                 JSON_OBJECT (KEY ''Procedure_Code''      VALUE TRIM(clm.service_code),
                                                                              KEY ''Description_of_Code'' VALUE INITCAP(TRIM(clm.service_short_desc))
                                                                              )
                                                                )
                                                           FROM claims_hub.hub_claims_medical clm1
                                                          WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                            AND clm1.claim_fact_key = clm.claim_fact_key
                                                            AND clm1.claim_line_fact_key = clm.claim_line_fact_key
                                                   )                                                                AS Procedure_Code,
                                                   (SELECT JSON_ARRAYAGG
                                                           (
                                                            JSON_OBJECT (KEY ''Diagnosis_Code''      VALUE REPLACE(TRIM(diag.dx_1),''.''),
                                                                         KEY ''Description_of_Code'' VALUE NVL(INITCAP(TRIM(diag.dx_long_desc_1)) ,'''')
                                                                        )
                                                           )
                                                      FROM claims_hub.hub_claim_line_to_diagnosis diag
                                                     WHERE diag.claim_fact_key = clm.claim_fact_key
                                                       AND diag.claim_line_fact_key = clm.claim_line_fact_key
                                                   )                                                                AS Diagnosis_Code,
                                                   (SELECT JSON_ARRAYAGG
                                                           (
                                                            JSON_OBJECT (KEY ''Claim_Code''          VALUE code,
                                                                         KEY ''Description_of_Code'' VALUE msg_desc
                                                                        )
                                                           )
                                                      FROM (SELECT DISTINCT
                                                                   TRIM(msgc.code_1) AS code,
                                                                   TRIM(msgc.desc_1) AS msg_desc
                                                              FROM claims_hub.hub_claims_to_msg_code msgc
                                                             WHERE msgc.claim_fact_key = clm.claim_fact_key
                                                               AND msgc.claim_line_fact_key = clm.claim_line_fact_key
                                                           )
                                                   )                                                                AS Claim_Code,
                                                   clm.unit_count                                                   AS Units,
                                                   CASE WHEN clm.billed_amount IS NOT NULL
                                                             THEN ''$'' || clm.billed_amount
                                                   END                                                              AS Charges,
                                                   CASE WHEN clm.base_allowed_amount IS NOT NULL
                                                             THEN ''$'' || clm.base_allowed_amount
                                                   END                                                              AS Allowed,
                                                   CASE WHEN clm.base_deductible_amount IS NOT NULL
                                                             THEN ''$'' || clm.base_deductible_amount
                                                   END                                                              AS Deductible,
                                                   CASE WHEN clm.base_coinsurance_amount IS NOT NULL
                                                             THEN clm.base_coinsurance_amount
                                                   END                                                              AS Coinsurance,
                                                   CASE WHEN clm.base_paid_amount IS NOT NULL
                                                             THEN ''$'' || clm.base_paid_amount
                                                   END                                                              AS Plan_Paid,
                                                   clm.benefit_tier_type                                            AS Network,
                                                   clm.is_capitated                                                 AS Cap_No_Cap,
                                                   (SELECT DISTINCT JSON_OBJECT (
                                                                        KEY ''Total_Charges''     VALUE TO_CHAR(SUM(clm1.billed_amount)),
                                                                        KEY ''Total_Allowed''     VALUE TO_CHAR(SUM(clm1.base_allowed_amount)),
                                                                        KEY ''Total_Deductible''  VALUE TO_CHAR(SUM(clm1.base_deductible_amount)),
                                                                        KEY ''Total_Coinsurance'' VALUE TO_CHAR(SUM(clm1.base_coinsurance_amount)),
                                                                        KEY ''Total_Plan_Paid''   VALUE TO_CHAR(SUM(clm1.base_paid_amount)),
                                                                        KEY ''Total_Units''       VALUE TO_CHAR(SUM(clm1.unit_count)),
                                                                        KEY ''Total_Copay''       VALUE TO_CHAR(SUM(clm1.base_copay_amount))
                                                                       )
                                                      FROM claims_hub.hub_claims_medical clm1
                                                     WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                       AND clm1.claim_fact_key = clm.claim_fact_key
                                                       AND clm1.claim_status_php <> ''Reversed''
                                                       AND clm1.claim_line_status_code <> ''r''
                                                       AND (clm1.billed_amount IS NOT NULL OR
                                                            clm1.base_allowed_amount IS NOT NULL OR
                                                            clm1.base_deductible_amount IS NOT NULL OR
                                                            clm1.base_coinsurance_amount IS NOT NULL OR
                                                            clm1.base_paid_amount IS NOT NULL OR
                                                            clm1.unit_count IS NOT NULL OR
                                                            clm1.base_copay_amount IS NOT NULL
                                                           )
                                                   )                                                                AS Total,
                                                   clm.claim_adjustment_reason_code                                 AS Rarc_Carc,
                                                   CASE WHEN clm.base_copay_amount IS NOT NULL
                                                        THEN ''$'' || clm.base_copay_amount
                                                    END                                                             AS Copay
                                               FROM claims_hub.hub_claims_medical clm ';

               v_query := v_query || 'WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key ||''' ';
               v_query := v_query || 'AND clm.claim_status_php <> ''Reversed'' ';
               v_query := v_query || 'AND clm.claim_line_status_code <> ''r'' ) ';
               -- V 1.1 Changes Begin
               --v_query := v_query || ' ORDER BY Item_Number ) ';

               v_query := v_query || 'UNION
                                      SELECT Claim_Number                                                        AS claim_number,
                                             Claim_fact_key                                                      AS claim_fact_key,
                                             Claim_line_fact_key                                                 AS claim_line_fact_key,
                                             ROW_NUMBER() OVER (PARTITION BY claim_fact_key
                                                                    ORDER BY TO_NUMBER(original_line_number),
                                                                             TO_NUMBER(claim_line_fact_key) ASC) AS item_number,
                                             Procedure_Code                                                      AS procedure_code,
                                             Diagnosis_Code                                                      AS diagnosis_code,
                                             Claim_Code                                                          AS claim_code,
                                             Units                                                               AS units,
                                             Charges                                                             AS charges,
                                             Allowed                                                             AS allowed,
                                             Deductible                                                          AS deductible,
                                             Coinsurance                                                         AS coinsurance,
                                             Plan_Paid                                                           AS plan_paid,
                                             Network                                                             AS network,
                                             Cap_No_Cap                                                          AS cap_no_cap,
                                             Total                                                               AS total,
                                             Rarc_Carc                                                           AS rarc_carc,
                                             Copay                                                               AS copay
                                             FROM (
                                                   SELECT DISTINCT
                                                          clm.claim_hcc_id                                                 AS Claim_Number,
                                                          clm.claim_fact_key                                               AS Claim_fact_key,
                                                          clm.claim_line_fact_key                                          AS Claim_line_fact_key,
                                                          clm.claim_line_hcc_id                                            AS Item_Number,
                                                          clm.original_line_number                                         AS Original_line_number,
                                                          (SELECT JSON_ARRAYAGG
                                                                       (
                                                                        JSON_OBJECT (KEY ''Procedure_Code''      VALUE TRIM(clm.service_code),
                                                                                     KEY ''Description_of_Code'' VALUE INITCAP(TRIM(clm.service_short_desc))
                                                                                     )
                                                                       )
                                                                  FROM claims_hub.hub_claims_medical_othsts clm1
                                                                 WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                   AND clm1.claim_fact_key = clm.claim_fact_key
                                                                   AND clm1.claim_line_fact_key = clm.claim_line_fact_key
                                                          )                                                                AS Procedure_Code,
                                                          (SELECT JSON_ARRAYAGG
                                                                  (
                                                                   JSON_OBJECT (KEY ''Diagnosis_Code''      VALUE REPLACE(TRIM(diag.dx_1),''.''),
                                                                                KEY ''Description_of_Code'' VALUE NVL(INITCAP(TRIM(diag.dx_long_desc_1)) ,'''')
                                                                               )
                                                                  )
                                                             FROM claims_hub.hub_claim_line_to_diagnosis_othsts diag
                                                            WHERE diag.claim_fact_key = clm.claim_fact_key
                                                              AND diag.claim_line_fact_key = clm.claim_line_fact_key
                                                          )                                                                AS Diagnosis_Code,
                                                          (SELECT JSON_ARRAYAGG
                                                                  (
                                                                   JSON_OBJECT (KEY ''Claim_Code''          VALUE code,
                                                                                KEY ''Description_of_Code'' VALUE msg_desc
                                                                               )
                                                                  )
                                                             FROM (SELECT DISTINCT
                                                                          TRIM(msgc.code_1) AS code,
                                                                          TRIM(msgc.desc_1) AS msg_desc
                                                                     FROM claims_hub.hub_claims_to_msg_info_othsts msgc
                                                                    WHERE msgc.claim_fact_key = clm.claim_fact_key
                                                                      AND msgc.claim_line_fact_key = clm.claim_line_fact_key
                                                                  )
                                                          )                                                                AS Claim_Code,
                                                          clm.unit_count                                                   AS Units,
                                                          CASE WHEN clm.billed_amount IS NOT NULL
                                                                    THEN ''$'' || clm.billed_amount
                                                          END                                                              AS Charges,
                                                          CASE WHEN clm.base_allowed_amount IS NOT NULL
                                                                    THEN ''$'' || clm.base_allowed_amount
                                                          END                                                              AS Allowed,
                                                          CASE WHEN clm.base_deductible_amount IS NOT NULL
                                                                    THEN ''$'' || clm.base_deductible_amount
                                                          END                                                              AS Deductible,
                                                          CASE WHEN clm.base_coinsurance_amount IS NOT NULL
                                                                    THEN clm.base_coinsurance_amount
                                                          END                                                              AS Coinsurance,
                                                          CASE WHEN clm.base_paid_amount IS NOT NULL
                                                                    THEN ''$'' || clm.base_paid_amount
                                                          END                                                              AS Plan_Paid,
                                                          clm.benefit_tier_type                                            AS Network,
                                                          clm.is_capitated                                                 AS Cap_No_Cap,
                                                          (SELECT DISTINCT JSON_OBJECT (
                                                                               KEY ''Total_Charges''     VALUE TO_CHAR(SUM(clm1.billed_amount)),
                                                                               KEY ''Total_Allowed''     VALUE TO_CHAR(SUM(clm1.base_allowed_amount)),
                                                                               KEY ''Total_Deductible''  VALUE TO_CHAR(SUM(clm1.base_deductible_amount)),
                                                                               KEY ''Total_Coinsurance'' VALUE TO_CHAR(SUM(clm1.base_coinsurance_amount)),
                                                                               KEY ''Total_Plan_Paid''   VALUE TO_CHAR(SUM(clm1.base_paid_amount)),
                                                                               KEY ''Total_Units''       VALUE TO_CHAR(SUM(clm1.unit_count)),
                                                                               KEY ''Total_Copay''       VALUE TO_CHAR(SUM(clm1.base_copay_amount))
                                                                              )
                                                             FROM claims_hub.hub_claims_medical_othsts clm1
                                                            WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                              AND clm1.claim_fact_key = clm.claim_fact_key
                                                              AND clm1.claim_status_php <> ''Reversed''
                                                              AND clm1.claim_line_status_code <> ''r''
                                                              AND (clm1.billed_amount IS NOT NULL OR
                                                                   clm1.base_allowed_amount IS NOT NULL OR
                                                                   clm1.base_deductible_amount IS NOT NULL OR
                                                                   clm1.base_coinsurance_amount IS NOT NULL OR
                                                                   clm1.base_paid_amount IS NOT NULL OR
                                                                   clm1.unit_count IS NOT NULL OR
                                                                   clm1.base_copay_amount IS NOT NULL
                                                                  )
                                                          )                                                                AS Total,
                                                          ''''                                                             AS Rarc_Carc,
                                                          CASE WHEN clm.base_copay_amount IS NOT NULL
                                                               THEN ''$'' || clm.base_copay_amount
                                                           END                                                             AS Copay
                                                      FROM claims_hub.hub_claims_medical_othsts clm ';

               v_query := v_query || 'WHERE clm.claim_hcc_id = ''' || v_claim_number || ''' AND clm.claim_fact_key = ''' || v_claim_fact_key ||''' ';
               v_query := v_query || 'AND clm.claim_status_php <> ''Reversed'' ';
               v_query := v_query || 'AND clm.claim_line_status_code <> ''r'' )';
               --v_query := v_query || 'AND clm.claim_status IN (''Needs Repair'',''Rejected'',''Needs Review'',''Needs Repricing'') ) ';
               v_query := v_query || ')ORDER BY Item_Number ';
               -- V 1.1 Changes End
               -- V 1.2 Changes Begin
               ------------------------------------------------------------------------------------------
               -- Pagination logic
               ------------------------------------------------------------------------------------------
               IF (v_offset IS NULL OR v_limit IS NULL) THEN
                   v_query := v_query || ' OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY ';
                ELSE
                    v_query := v_query || ' OFFSET ' || v_offset || ' ROWS FETCH NEXT ' || v_limit || ' ROWS ONLY ';
               END IF;
               -- V 1.2 Changes End
               ------------------------------------------------------------------------------------------
               -- Select statement execution and assign values into variable
               ------------------------------------------------------------------------------------------
               EXECUTE IMMEDIATE v_query BULK COLLECT INTO v_claim_line_rec_type;

               ------------------------------------------------------------------------------------------
               -- For loop to read values from variable and save into object
               ------------------------------------------------------------------------------------------
               FOR v_claim_line_dtl IN 1 .. v_claim_line_rec_type.COUNT
               LOOP
                   v_claim_line_obj:= JSON_OBJECT_T();
                   v_claim_line_obj.put('Claim_Number'       , v_claim_line_rec_type (v_claim_line_dtl).claim_number       );
                   v_claim_line_obj.put('Claim_Fact_Key'     , v_claim_line_rec_type (v_claim_line_dtl).claim_fact_key     );
                   v_claim_line_obj.put('Claim_Line_Fact_Key', v_claim_line_rec_type (v_claim_line_dtl).claim_line_fact_key);
                   v_claim_line_obj.put('Item_Number'        , v_claim_line_rec_type (v_claim_line_dtl).item_number        );
                   v_claim_line_obj.put('Procedure_Code'     , v_claim_line_rec_type (v_claim_line_dtl).procedure_code     );
                   v_claim_line_obj.put('Diagnosis_Code'     , v_claim_line_rec_type (v_claim_line_dtl).diagnosis_code     );
                   v_claim_line_obj.put('Claim_Code'         , v_claim_line_rec_type (v_claim_line_dtl).claim_code         );
                   v_claim_line_obj.put('Units'              , v_claim_line_rec_type (v_claim_line_dtl).units              );
                   v_claim_line_obj.put('Charges'            , v_claim_line_rec_type (v_claim_line_dtl).charges            );
                   v_claim_line_obj.put('Allowed'            , v_claim_line_rec_type (v_claim_line_dtl).allowed            );
                   v_claim_line_obj.put('Deductible'         , v_claim_line_rec_type (v_claim_line_dtl).deductible         );
                   v_claim_line_obj.put('Coinsurance'        , v_claim_line_rec_type (v_claim_line_dtl).coinsurance        );
                   v_claim_line_obj.put('Plan_Paid'          , v_claim_line_rec_type (v_claim_line_dtl).plan_paid          );
                   v_claim_line_obj.put('Network'            , v_claim_line_rec_type (v_claim_line_dtl).network            );
                   v_claim_line_obj.put('Cap_No_Cap'         , v_claim_line_rec_type (v_claim_line_dtl).cap_no_cap         );
                   v_claim_line_obj.put('Total'              , v_claim_line_rec_type (v_claim_line_dtl).total              );
                   v_claim_line_obj.put('Rarc_Carc'          , v_claim_line_rec_type (v_claim_line_dtl).rarc_carc          );
                   v_claim_line_obj.put('Copay'              , v_claim_line_rec_type (v_claim_line_dtl).copay              );

                   v_claim_line_ary.append(v_claim_line_obj);
                   v_ind := 'Y';
                END LOOP;
            -- V 1.2 Changes Begin
             ELSE
                 v_ind := 'N';
            END IF;
            -- V 1.2 Changes End

            ------------------------------------------------------------------------------------------
            -- Save values into response object and assign into response variable
            ------------------------------------------------------------------------------------------
            IF v_ind = 'Y' THEN
               v_response_obj.put('Claim_Line_Details', v_claim_line_ary);
               -- V 1.2 Changes Begin
               v_response_obj.put('Total_Count', v_rec_count);
               v_response_obj.put('Page_Number', v_page_num);
               -- V 1.2 Changes End
               v_response_obj.put('System_Code', '200');
               v_response_obj.put('System_Message', 'Claim line details found');
               v_response_obj.put('Status', 'Success');
               v_response := v_response_obj.to_clob;
             ELSE
                v_response_obj.put('Claim_Line_Details', v_claim_line_ary);
                v_response_obj.put('System_Code', '204');
                v_response_obj.put('System_Message', 'Claim line details not found');
                v_response_obj.put('Status', 'Success');
                v_response := v_response_obj.to_clob;
            END IF;
       END IF;

       ------------------------------------------------------------------------------------------
       -- Exception Handling
       ------------------------------------------------------------------------------------------
       EXCEPTION
                WHEN v_program_error THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;

                WHEN OTHERS THEN
                     v_response_obj.put('System_Code', '400');
                     v_response_obj.put('System_Message', SQLCODE ||' : '|| SQLERRM);
                     v_response_obj.put('Status', 'Fail');
                     v_response := v_response_obj.to_String;
      COMMIT;
  END provider_connect_claim_line_details_get_prc;
  /*******************************************************************************************************************/

  /********************************************************************************************************************
  ** NAME                 : PROVIDER_CONNECT_CLAIM_DOWNLOAD_PRC                                                      **
  **                                                                                                                 **
  ** VERSION              : 1.0                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To download report for claim details                                                     **
  **                                                                                                                 **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : Claims, member details, Begin date and end date                                          **
  **               OUTPUT : Response with XML data base result-set                                                   **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 05/20/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 05/20/2024    | Cognizant  | Initial Version                                                    **
  ********************************************************************************************************************/
  PROCEDURE provider_connect_claim_download_prc(
                                                 v_clm_number         IN CLOB,
                                                 v_begin_date         IN VARCHAR2,
                                                 v_end_date           IN VARCHAR2,
                                                 v_mem_member_id      IN VARCHAR2,
                                                 v_mem_first_name     IN VARCHAR2,
                                                 v_mem_last_name      IN VARCHAR2,
                                                 v_mem_dob            IN VARCHAR2,
                                                 v_patient_ssn        IN VARCHAR2,
                                                 v_mem_medicaid_id    IN VARCHAR2,
                                                 v_check_number       IN VARCHAR2,
                                                 v_prov_tin           IN VARCHAR2,
                                                 v_prov_npi           IN VARCHAR2,
                                                 v_xmlout            OUT CLOB
                                                 )
  AS
    v_xmltype                 XMLTYPE;
    v_xml_dom_out             dbms_xmldom.domdocument;
    v_root_node               dbms_xmldom.domnode;
    v_pc_claim_element        dbms_xmldom.domelement;
    v_pc_claim_node           dbms_xmldom.domnode;
    v_download_element        dbms_xmldom.domelement;
    v_download_node           dbms_xmldom.domnode;
    v_download_text           dbms_xmldom.domtext;
    v_download_textnode       dbms_xmldom.domnode;
    v_header_element          dbms_xmldom.domelement;
    v_header_node             dbms_xmldom.domnode;
    v_header_text             dbms_xmldom.domtext;
    v_header_textnode         dbms_xmldom.domnode;
    v_pc_success_element      dbms_xmldom.domelement;
    v_pc_success_node         dbms_xmldom.domnode;
    v_pc_success_text         dbms_xmldom.domtext;
    v_pc_success_textnode     dbms_xmldom.domnode;
    v_claim_download_rec_type claim_download_rec_table:= claim_download_rec_table();
    v_download_result         CLOB;
    v_query                   CLOB;
    v_header_query            CLOB;
    v_base_query              CLOB;
    v_have_data               BOOLEAN := FALSE;

    ------------------------------------------------------------------------------------------
    -- Local variables declaration
    ------------------------------------------------------------------------------------------
    v_get_claim_nos           CLOB;
    v_claim_number            CLOB := v_clm_number;
    v_days                    NUMBER;
    v_date                    VARCHAR2(10);

  BEGIN
       v_xml_dom_out             := xmldom.newdomdocument;
       v_root_node               := xmldom.makenode(v_xml_dom_out);
       v_pc_claim_element        := xmldom.createelement(v_xml_dom_out, 'PC_Claims_Download');
       v_pc_claim_node           := xmldom.appendchild(v_root_node, xmldom.makenode(v_pc_claim_element));
       v_base_query              := 'SELECT claim_download_rec(csv_row) FROM ( ';
       v_header_query            := 'claim_number,claim_fact_key,member_id,patient_name,member_dob,patient_ssn,medicaid_id,group_id,group_name,subscriber_name,patient_account_number,date_of_service,claim_status,claim_status_php,total_charge,paid_to,paid_amount,date_claim_was_received,date_claim_was_paid_on,total_check_amount,payment_status_desc,check_number,claim_data_updated';

       ------------------------------------------------------------------------------------------
       -- To get number of days
       ------------------------------------------------------------------------------------------
       IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) THEN
           SELECT TO_DATE(v_end_date, 'YYYYMMDD') - TO_DATE(v_begin_date, 'YYYYMMDD') INTO v_days FROM DUAL;
       END IF;

       ------------------------------------------------------------------------------------------
       -- To check null input parameters
       ------------------------------------------------------------------------------------------
       IF ( v_claim_number     IS NULL AND
            v_begin_date       IS NULL AND
            v_end_date         IS NULL AND
            v_mem_member_id    IS NULL AND
            v_mem_first_name   IS NULL AND
            v_mem_last_name    IS NULL AND
            v_mem_dob          IS NULL AND
            v_patient_ssn      IS NULL AND
            v_mem_medicaid_id  IS NULL AND
            v_check_number     IS NULL AND
            v_prov_npi         IS NULL
           ) THEN
                v_pc_success_element       := dbms_xmldom.createelement(v_xml_dom_out, 'status');
                v_pc_success_node          := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_pc_success_element));
                v_pc_success_text          := dbms_xmldom.createtextnode(v_xml_dom_out, 'success');
                v_pc_success_textnode      := dbms_xmldom.appendchild(v_pc_success_node, dbms_xmldom.makenode(v_pc_success_text));
                v_download_element         := dbms_xmldom.createelement(v_xml_dom_out, 'download');
                v_download_node            := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
                v_download_text            := dbms_xmldom.createtextnode(v_xml_dom_out, 'System could not find valid details .Please try again.');
                v_download_textnode        := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));

        ELSIF ((v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date > v_end_date)) OR (v_days > 93) THEN
                v_pc_success_element      := dbms_xmldom.createelement(v_xml_dom_out, 'status');
                v_pc_success_node         := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_pc_success_element));
                v_pc_success_text         := dbms_xmldom.createtextnode(v_xml_dom_out, 'success');
                v_pc_success_textnode     := dbms_xmldom.appendchild(v_pc_success_node, dbms_xmldom.makenode(v_pc_success_text));
                v_download_element         := dbms_xmldom.createelement(v_xml_dom_out, 'download');
                v_download_node            := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
                v_download_text            := dbms_xmldom.createtextnode(v_xml_dom_out, 'You can select maximum 3 months of data and End date should be greater than begin date.Please try again.');
                v_download_textnode        := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));

        ELSIF (v_claim_number     IS NOT NULL   OR
               v_check_number     IS NOT NULL)  OR
              ((v_mem_member_id   IS NOT NULL   OR
                v_patient_ssn     IS NOT NULL   OR
                v_mem_medicaid_id IS NOT NULL)  AND
               (v_begin_date      IS NOT NULL   AND
                v_end_date        IS NOT NULL)) OR
              ((v_mem_first_name  IS NOT NULL   AND
                v_mem_last_name   IS NOT NULL   AND
                v_mem_dob         IS NOT NULL)  AND
               (v_begin_date      IS NOT NULL   AND
                v_end_date        IS NOT NULL)) OR
              (v_prov_npi         IS NOT NULL   AND
               v_begin_date       IS NOT NULL   AND
               v_end_date         IS NOT NULL)
               THEN
                  ------------------------------------------------------------------------------------------
                  -- Split claim numbers
                  ------------------------------------------------------------------------------------------
                  IF v_claim_number IS NOT NULL THEN
                        v_get_claim_nos := get_claim_lists(v_claim_number);
                        v_claim_number := v_get_claim_nos;
                  END IF;

                  v_query := 'SELECT  claim_number'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' claim_fact_key'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' member_id'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' patient_name'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' member_dob'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' patient_ssn'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' medicaid_id'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' group_id'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' group_name'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' subscriber_name'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' patient_account_number'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' date_of_service'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' claim_status'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' claim_status_php'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' total_charge'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' paid_to'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' paid_amount'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' date_claim_was_received'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' date_claim_was_paid_on'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' total_check_amount'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' payment_status_desc'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' check_number'||  ' || '  || ''''  || '|' || '''' || ' || ' ||
                                    ' claim_data_updated AS csv_row
                               FROM (
                                     SELECT DISTINCT
                                            clm.claim_hcc_id                                                          AS claim_number,
                                            clm.claim_fact_key                                                        AS claim_fact_key,
                                            ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                            INITCAP(ees.meme_first_name)                                              AS member_first_name,
                                            INITCAP(ees.meme_last_name)                                               AS member_last_name,
                                            TO_CHAR(ees.meme_birth_dt,''MM/DD/YYYY'')                                 AS member_dob,
                                            ees.meme_ssn                                                              AS patient_ssn,
                                            clm.check_number                                                          AS check_number,
                                            ees.meme_medcd_no                                                         AS medicaid_id,
                                            INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                            || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                            ees.grgr_id                                                               AS group_id,
                                            INITCAP(ees.grgr_name)                                                    AS group_name,
                                            INITCAP(ees.sbsb_last_name || '' '' || ees.sbsb_first_name
                                            || '' '' || ees.sbsb_mid_init)                                            AS subscriber_name,
                                            clm.patient_account_number                                                AS patient_account_number,
                                            clm.claim_status                                                          AS claim_status,
                                            ( SELECT INITCAP(prv1.provider_name)
                                                FROM claims_hub.hub_claims_to_provider prv1
                                               WHERE prv1.claim_fact_key = clm.claim_fact_key
                                                 AND prv1.provider_type = ''SUPPLIER''
                                            )                                                                         AS paid_to,
                                            TO_CHAR(clm.receipt_dt,''MM/DD/YYYY'')                                    AS date_claim_was_received,
                                            TO_CHAR(clm.paid_dt,''MM/DD/YYYY'')                                       AS date_claim_was_paid_on,
                                            CASE WHEN clm.total_check_amount IS NOT NULL THEN
                                                      ''$'' || clm.total_check_amount
                                            END                                                                       AS total_check_amount,
                                            clm.payment_status_desc                                                   AS payment_status_desc,
                                            TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                            (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                               TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                         WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                         WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                     END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                      MAX(clm1.svc_dt_end) AS svc_dt_end
                                                                 FROM claims_hub.hub_claims_medical clm1
                                                                WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                  AND clm1.claim_fact_key = clm.claim_fact_key
                                                                  AND clm1.claim_status_php <> ''Reversed''
                                                                  AND clm1.claim_line_status_code <> ''r''
                                             ))                                                                       AS date_of_service,
                                            clm.claim_status_php                                                      AS claim_status_php,
                                            (SELECT SUM(clm2.billed_amount)
                                               FROM claims_hub.hub_claims_medical clm2
                                              WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                                AND clm2.claim_fact_key = clm.claim_fact_key
                                                AND clm2.claim_status_php <> ''Reversed''
                                                AND clm2.billed_amount IS NOT NULL
                                                AND clm2.claim_line_status_code <> ''r''
                                            )                                                                         AS total_charge,
                                            (SELECT SUM(clm3.paid_amount)
                                               FROM claims_hub.hub_claims_medical clm3
                                              WHERE clm3.claim_hcc_id = clm.claim_hcc_id
                                                AND clm3.claim_fact_key = clm.claim_fact_key
                                                AND clm3.claim_status_php <> ''Reversed''
                                                AND clm3.paid_amount IS NOT NULL
                                                AND clm3.claim_line_status_code <> ''r''
                                            )                                                                         AS paid_amount
                                       FROM claims_hub.hub_claims_medical clm
                                       JOIN payors_hub.php_ees_master_tb ees
                                         ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
                  IF v_prov_tin IS NOT NULL THEN
                     v_query := v_query || 'LEFT OUTER JOIN claims_hub.hub_claims_to_provider prv
                                                         ON prv.claim_fact_key = clm.claim_fact_key ';
                  END IF;

                  IF v_claim_number IS NOT NULL OR v_check_number IS NOT NULL THEN

                     IF v_claim_number IS NOT NULL THEN
                        v_query := v_query || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                      ELSE
                        v_query := v_query || 'WHERE (1=1 OR clm.claim_hcc_id IS NULL) ';
                     END IF;

                     IF v_check_number IS NOT NULL THEN
                        v_query := v_query || 'AND clm.check_number = '''|| v_check_number || ''' ';
                     END IF;

                     IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                        SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                      ELSE
                        SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                     END IF;
                     v_query := v_query || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';

                   ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN

                         IF v_mem_member_id IS NOT NULL THEN
                            v_query := v_query || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                          ELSE
                            v_query := v_query || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                         END IF;

                         IF v_patient_ssn IS NOT NULL THEN
                            v_query := v_query || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                         END IF;

                         IF v_mem_medicaid_id IS NOT NULL THEN
                            v_query := v_query || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                         END IF;

                   ELSIF (v_mem_first_name IS NOT NULL AND v_mem_last_name  IS NOT NULL AND v_mem_dob IS NOT NULL ) THEN
                          v_query := v_query || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                          v_query := v_query || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                          v_query := v_query || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';

                   ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                         v_query := v_query || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
                  END IF;

                  IF v_prov_tin IS NOT NULL THEN
                     v_query := v_query || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
                  END IF;

                  IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                      v_query := v_query || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                      v_query := v_query || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
                  END IF;

                  v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
                  v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
                  v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';

                  IF v_check_number IS NULL THEN
                     v_query := v_query || 'UNION
                                            SELECT DISTINCT
                                                   clm.claim_hcc_id                                                          AS claim_number,
                                                   clm.claim_fact_key                                                        AS claim_fact_key,
                                                   ees.sbsb_id || ees.meme_sfx                                               AS member_id,
                                                   INITCAP(ees.meme_first_name)                                              AS member_first_name,
                                                   INITCAP(ees.meme_last_name)                                               AS member_last_name,
                                                   TO_CHAR(ees.meme_birth_dt,''MM/DD/YYYY'')                                 AS member_dob,
                                                   ees.meme_ssn                                                              AS patient_ssn,
                                                   TO_NUMBER('''')                                                           AS check_number,
                                                   ees.meme_medcd_no                                                         AS medicaid_id,
                                                   INITCAP(ees.meme_last_name || '' '' || ees.meme_first_name
                                                   || '' '' || ees.meme_mid_init)                                            AS patient_name,
                                                   ees.grgr_id                                                               AS group_id,
                                                   INITCAP(ees.grgr_name)                                                    AS group_name,
                                                   INITCAP(ees.sbsb_last_name || '' '' || ees.sbsb_first_name
                                                   || '' '' || ees.sbsb_mid_init)                                            AS subscriber_name,
                                                   clm.patient_account_number                                                AS patient_account_number,
                                                   clm.claim_status                                                          AS claim_status,
                                                   (SELECT INITCAP(prv1.supplier_name)
                                                      FROM claims_hub.hub_claims_to_supplier_othsts prv1
                                                     WHERE prv1.claim_fact_key = clm.claim_fact_key
                                                   )                                                                         AS paid_to,
                                                   TO_CHAR(clm.receipt_dt,''MM/DD/YYYY'')                                    AS date_claim_was_received,
                                                   TO_CHAR(clm.paid_dt,''MM/DD/YYYY'')                                       AS date_claim_was_paid_on,
                                                   CASE WHEN clm.total_check_amount IS NOT NULL THEN
                                                             ''$'' || clm.total_check_amount
                                                   END                                                                       AS total_check_amount,
                                                   clm.payment_status_desc                                                   AS payment_status_desc,
                                                   TO_CHAR(most_recent_process_time,''MM/DD/YYYY'')                          AS claim_data_updated,
                                                   (SELECT CASE WHEN (svc_dt_beg IS NOT NULL AND svc_dt_end IS NOT NULL) THEN
                                                                      TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                                WHEN svc_dt_beg IS NOT NULL THEN TO_CHAR(svc_dt_beg,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_beg,''MM/DD/YYYY'')
                                                                WHEN svc_dt_end IS NOT NULL THEN TO_CHAR(svc_dt_end,''MM/DD/YYYY'') || '' to '' || TO_CHAR(svc_dt_end,''MM/DD/YYYY'')
                                                            END FROM (SELECT MIN(clm1.svc_dt_beg) AS svc_dt_beg,
                                                                             MAX(clm1.svc_dt_end) AS svc_dt_end
                                                                        FROM claims_hub.hub_claims_medical_othsts clm1
                                                                       WHERE clm1.claim_hcc_id = clm.claim_hcc_id
                                                                         AND clm1.claim_fact_key = clm.claim_fact_key
                                                                         AND clm1.claim_status_php <> ''Reversed''
                                                                         AND clm1.claim_line_status_code <> ''r''
                                                                    )
                                                    )                                                                        AS date_of_service,
                                                   clm.claim_status_php                                                      AS claim_status_php,
                                                   (SELECT SUM(clm2.billed_amount)
                                                      FROM claims_hub.hub_claims_medical clm2
                                                     WHERE clm2.claim_hcc_id = clm.claim_hcc_id
                                                       AND clm2.claim_fact_key = clm.claim_fact_key
                                                       AND clm2.claim_status_php <> ''Reversed''
                                                       AND clm2.billed_amount IS NOT NULL
                                                       AND clm2.claim_line_status_code <> ''r''
                                                   )                                                                         AS total_charge,
                                                   (SELECT SUM(clm3.paid_amount)
                                                      FROM claims_hub.hub_claims_medical clm3
                                                     WHERE clm3.claim_hcc_id = clm.claim_hcc_id
                                                       AND clm3.claim_fact_key = clm.claim_fact_key
                                                       AND clm3.claim_status_php <> ''Reversed''
                                                       AND clm3.paid_amount IS NOT NULL
                                                       AND clm3.claim_line_status_code <> ''r''
                                                   )                                                                         AS paid_amount
                                              FROM claims_hub.hub_claims_medical_othsts clm
                                              JOIN payors_hub.php_ees_master_tb ees
                                                ON NVL(ees.member_key,ees.meme_ck) = clm.member_key ';
                     IF v_prov_tin IS NOT NULL THEN
                        v_query := v_query || 'LEFT OUTER JOIN claims_hub.hub_claims_to_provider prv
                                                            ON prv.claim_fact_key = clm.claim_fact_key ';
                     END IF;

                     IF v_claim_number IS NOT NULL  THEN

                        v_query := v_query || 'WHERE (clm.claim_hcc_id) IN (' || v_claim_number || ') ';
                        IF TO_CHAR(SYSDATE,'MMDD') = '0229' THEN
                           SELECT TO_CHAR(SYSDATE-1 - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                         ELSE
                           SELECT TO_CHAR(SYSDATE - INTERVAL '2' YEAR,'YYYYMM') INTO v_date FROM DUAL;
                        END IF;
                        v_query := v_query || ' AND clm.svc_dt_beg_yyyymm >= ''' || v_date || ''' ';

                      ELSIF v_mem_member_id IS NOT NULL OR v_patient_ssn IS NOT NULL OR v_mem_medicaid_id IS NOT NULL THEN

                            IF v_mem_member_id IS NOT NULL THEN
                               v_query := v_query || 'WHERE ees.sbsb_id||ees.meme_sfx = ''' ||v_mem_member_id || ''' ';
                             ELSE
                               v_query := v_query || 'WHERE (1=1 OR ees.sbsb_id||ees.meme_sfx IS NULL) ';
                            END IF;

                            IF v_patient_ssn IS NOT NULL THEN
                               v_query := v_query || 'AND ees.meme_ssn = '''|| v_patient_ssn || ''' ';
                            END IF;

                            IF v_mem_medicaid_id IS NOT NULL THEN
                               v_query := v_query || 'AND ees.meme_medcd_no = '''|| v_mem_medicaid_id || ''' ';
                            END IF;

                      ELSIF (v_mem_first_name IS NOT NULL AND
                             v_mem_last_name  IS NOT NULL AND
                             v_mem_dob        IS NOT NULL ) THEN
                             v_query := v_query || 'WHERE LOWER(ees.meme_first_name) = ''' || v_mem_first_name || ''' ';
                             v_query := v_query || 'AND LOWER(ees.meme_last_Name) = ''' || v_mem_last_name || ''' ';
                             v_query := v_query || 'AND TO_CHAR(ees.meme_birth_dt,''YYYYMMDD'') = '''|| v_mem_dob || ''' ';

                      ELSIF v_prov_npi IS NOT NULL AND v_prov_tin IS NOT NULL THEN
                            v_query := v_query || 'WHERE prv.provider_npi = '''|| v_prov_npi || ''' ';
                     END IF;

                     IF v_prov_tin IS NOT NULL THEN
                        v_query := v_query || 'AND prv.tax_id = '''|| v_prov_tin || ''' ';
                     END IF;

                     IF (v_begin_date IS NOT NULL AND v_end_date IS NOT NULL) AND (v_begin_date <= v_end_date) AND v_days <= 93 THEN
                         v_query := v_query || 'AND TO_CHAR(clm.svc_dt_beg,''YYYYMMDD'') >= ''' || v_begin_date || ''' ';
                         v_query := v_query || 'AND TO_CHAR(clm.svc_dt_end,''YYYYMMDD'') <= ''' || v_end_date || ''' ';
                     END IF;

                     v_query := v_query || ' AND clm.claim_status_php <> ''Reversed'' AND ees.cspd_cat = ''M'' ';
                     v_query := v_query || ' AND clm.claim_line_status_code <> ''r'' ';
                     v_query := v_query || ' AND ees.source = SUBSTR(clm.source,1,3) ';
                  END IF;

                  v_query := v_query || ' )ORDER BY claim_number,claim_fact_key ';

                  EXECUTE IMMEDIATE  v_base_query || v_query  BULK COLLECT INTO v_claim_download_rec_type;

                  IF v_claim_download_rec_type.COUNT > 0 THEN
                     v_have_data             := TRUE;
                     v_pc_success_element    := dbms_xmldom.createelement(v_xml_dom_out, 'status');
                     v_pc_success_node       := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_pc_success_element));
                     v_pc_success_text       := dbms_xmldom.createtextnode(v_xml_dom_out, 'success');
                     v_pc_success_textnode   := dbms_xmldom.appendchild(v_pc_success_node, dbms_xmldom.makenode(v_pc_success_text));
                     v_download_element      := dbms_xmldom.createelement(v_xml_dom_out, 'download');
                     v_download_node         := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
                     v_download_text         := dbms_xmldom.createtextnode(v_xml_dom_out,v_header_query);
                     v_download_textnode     := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));
                  END IF;

                  FOR idx in 1.. v_claim_download_rec_type.COUNT
                  LOOP
                      v_have_data            := TRUE;
                      v_download_element     := dbms_xmldom.createelement(v_xml_dom_out, 'download');
                      v_download_node        := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
                      v_download_text        := dbms_xmldom.createtextnode(v_xml_dom_out,v_claim_download_rec_type(idx).csv_row);
                      v_download_textnode    := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));
                  END LOOP;

                  IF NOT v_have_data THEN
                     v_pc_success_element    := dbms_xmldom.createelement(v_xml_dom_out, 'status');
                     v_pc_success_node       := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_pc_success_element));
                     v_pc_success_text       := dbms_xmldom.createtextnode(v_xml_dom_out, 'success');
                     v_pc_success_textnode   := dbms_xmldom.appendchild(v_pc_success_node, dbms_xmldom.makenode(v_pc_success_text));
                     v_download_element      := dbms_xmldom.createelement(v_xml_dom_out, 'download');
                     v_download_node         := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
                     v_download_text         := dbms_xmldom.createtextnode(v_xml_dom_out, 'No Data found');
                     v_download_textnode     := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));
                  END IF;
        ELSE
            v_pc_success_element       := dbms_xmldom.createelement(v_xml_dom_out, 'status');
            v_pc_success_node          := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_pc_success_element));
            v_pc_success_text          := dbms_xmldom.createtextnode(v_xml_dom_out, 'success');
            v_pc_success_textnode      := dbms_xmldom.appendchild(v_pc_success_node, dbms_xmldom.makenode(v_pc_success_text));
            v_download_element         := dbms_xmldom.createelement(v_xml_dom_out, 'download');
            v_download_node            := dbms_xmldom.appendchild(v_pc_claim_node, dbms_xmldom.makenode(v_download_element));
            v_download_text            := dbms_xmldom.createtextnode(v_xml_dom_out, 'System could not find valid details .Please try again.');
            v_download_textnode        := dbms_xmldom.appendchild(v_download_node, dbms_xmldom.makenode(v_download_text));
       END IF;

       v_xmltype := dbms_xmldom.getxmltype(v_xml_dom_out);
       v_xmlout := v_xmltype.getclobval();

   END provider_connect_claim_download_prc;
  /********************************************************************************************************************/

  /********************************************************************************************************************
  ** NAME                 : GET_CLAIM_LISTS                                                                          **
  **                                                                                                                 **
  ** VERSION              : 1.0                                                                                      **
  **                                                                                                                 **
  ** DESCRIPTION          : To split comma delimited values when user entered multiple claim numbers with comma      **
  **                        separated                                                                                **
  ** PARAMETERS           :                                                                                          **
  **                INPUT : claim ids with comma separated                                                            **
  **               OUTPUT : claim ids with out comma separated                                                        **
  **                                                                                                                 **
  ** AUTHOR               : COGNIZANT                                                                                **
  **                                                                                                                 **
  ** DATE                 : 04/08/2024                                                                               **
  *------------------------------------------------------------------------------------------------------------------**
  * CHANGE VERSION | HISTORY DATE | AUTHOR     | CHANGE DESCRIPTION                                                  **
  * ---------------| ------------ | -----------| --------------------------------------------------------------------**
  * 1.0            | 04/08/2024   | Cognizant  | Initial Version                                                     **
  ********************************************************************************************************************/
  FUNCTION get_claim_lists (v_claim_id VARCHAR2) RETURN VARCHAR2
  AS
    ------------------------------------------------------------------------------------------------
    -- Initializing variables
    ------------------------------------------------------------------------------------------------
    v_clm_id          CLOB;
    v_get_claim_nos   CLOB;

  BEGIN
       ------------------------------------------------------------------------------------------------
       -- To split comma delimited values for multiple claim numbers
       ------------------------------------------------------------------------------------------------
       FOR v_clm_id IN (SELECT TRIM(REGEXP_SUBSTR(v_claim_id, '[^,]+', 1, LEVEL)) l FROM DUAL CONNECT BY LEVEL <= regexp_count(v_claim_id, ',')+1)
       LOOP
           v_get_claim_nos :=  v_get_claim_nos || '''' || v_clm_id.l || '''' || ',';
       END LOOP;

       RETURN RTRIM(v_get_claim_nos,',');

       EXCEPTION WHEN NO_DATA_FOUND THEN
       RETURN 0;

  END get_claim_lists;
  /*******************************************************************************************************************/

END provider_connect_claims_pkg ;
/
 

PL/SQL Online Compiler

Write, Run & Share PL/SQL code online using OneCompiler's Oracle PL/SQL online editor and compiler for free. It's one of the robust, feature-rich online editor and compiler for Oracle PL/SQL running on latest version 23c (23.3.0.0). Getting started with the OneCompiler's Oracle PL/SQL editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'PL/SQL' and start writing code to learn and test online without worrying about tedious process of installation.

About PL/SQL

PL/SQL is procedural extension for SQL created by Oracle. It is by default embedded into the Oracle Database. PL/SQL program units are compiled and stored inside the Oracle Database which results in optimal execution times as the PL/SQL and SQL run within the same server process.

Syntax help

Following is the syntax structure for the PL/SQL code blocks

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

Example

DECLARE 
   message  varchar2(100):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

Named procedures

CREATE OR REPLACE FUNCTION 
hello_user
   (user_name IN VARCHAR2) 
    RETURN VARCHAR2
IS
BEGIN
   RETURN 'Hello ' || user_name;
END hello_user;
/

BEGIN
   dbms_output.put_line(hello_user('Peter'));
END;
/

Exception handling

BEGIN
  DBMS_OUTPUT.put_line (1/0);
EXCEPTION
  WHEN OTHERS
  THEN
    DBMS_OUTPUT.put_line ('error is: ' || SQLERRM);
END;