Sunday 8 January 2017

Item Cost Conversion

CREATE OR REPLACE PACKAGE BODY XX_INVCNV02_COST_UPLOAD_PKG
AS
/********************************************************************************************
Package Name    :   XX_INVCNV02_COST_UPLOAD_PKG
Author's Name   :   Madhu Dhare
Date Written    :   18-Dec-2014
RICEW Object id :   INV_CNV_02
Purpose         :   Package Body
Program Style   :
--
Maintenance History:
Version       Date:             Name                 Remarks
-----------   -------------    ------------------   ---------------
 1.0          18-Dec-14     Madhu Dhare   Initial Version
***************************************************************************************************/
--
/*******************************************************************************
* Procedure Name :   XX_COMMON_VALIDATION_PRC
* Purpose        :   This program will validate organization code and cost type
*                    for the Cost Upload
*
*******************************************************************************/
   PROCEDURE XX_COMMON_VALIDATION_PRC(
      p_organization_code   IN OUT   xx_cst_item_dtls_preint.organization_code%TYPE,
      p_cost_type           IN OUT   xx_cst_item_dtls_preint.cost_type%TYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_ITM_COST_PRC
* Purpose        :   This program will validate item cost
*                    for the Cost Upload in Item details table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_ITM_COST_PRC(
      p_details_preint_rec   IN OUT   xx_cst_item_dtls_preint%ROWTYPE,
      p_header_id            IN       NUMBER,
      p_error_flag           OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_COST_PRC
* Purpose        :   This program will validate resource cost
*                    for the Cost Upload in Resource Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_RSC_COST_PRC (
      p_cost_resource_rec   IN OUT   xx_cst_resource_costs_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_OHD_PRC
* Purpose        :   This program will validate resource overhead cost
*                    for the Cost Upload in Resource Overhead Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_RSC_OHD_PRC (
      p_resc_overhead_rec   IN OUT   xx_cst_res_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_DEPT_OHD_PRC
* Purpose        :   This program will validate department overhead cost
*                    for the Cost Upload in Department Overhead Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_DEPT_OHD_PRC (
      p_dept_overhead_rec   IN OUT   xx_cst_dept_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************************************
Procedure Name : MAIN
Purpose        : This program will read the records from the staging tables
                 for  Cost upload in Item,Resource and overhead tables.Perform
control and business level validations .
        It will load the data into the interface tables and call the
        Oracle Import Program to Upload Cost.
*******************************************************************************************************/

   PROCEDURE MAIN (
      p_errbuf       OUT      VARCHAR2,
      p_retcode      OUT      VARCHAR2,
      p_run_option   IN       VARCHAR2,
      p_run_mode     IN       VARCHAR2,
      p_cost_type    IN       VARCHAR2
   )
   IS
--Cursor to select cost data based on run option from staging table
   CURSOR c_cst_details (p_rec_type VARCHAR2)
      IS
         SELECT     *
               FROM XX_CST_ITEM_UPLOAD_STG
              WHERE status = 'NW'
AND record_type != 'CNT'
                AND record_type =
                       DECODE (p_rec_type,
                               'ITM', 'ITM',
                               'RSC', 'RSC',
                               'OHD', 'OHD',
                               record_type
                              );
         --FOR UPDATE;

--CURSOR TO INSERT ITEM DATA INTO INTERFACE TABLE
--
--Cursor to insert in Cost Details Interface Table
      CURSOR c_details_preint
      IS
         SELECT *
           FROM XX_CST_ITEM_DTLS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Resource Cost Interface Table
      CURSOR c_cost_resource
      IS
         SELECT *
           FROM XX_CST_RESOURCE_COSTS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Resource Overheads Interface Table
      CURSOR c_resc_overhead
      IS
         SELECT *
           FROM XX_CST_RES_OVERHEADS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Department Overheads Interface Table
      CURSOR c_dept_overhead
      IS
         SELECT *
           FROM XX_CST_DEPT_OVERHEADS_PREINT
          WHERE status = 'IP';

/*--------------------------------------------------------------------------------------------------------
Private Variable Declaration Section
---------------------------------------------------------------------------------------------------------*/
--General Variables
      l_seq_val1                      NUMBER;
      l_seq_val2                      NUMBER;
      l_seq_val3                      NUMBER;
      l_seq_val4                      NUMBER;
      l_standard_request_id           fnd_concurrent_requests.request_id%TYPE  := 0;
      l_completed                     BOOLEAN;
      l_process_status                NUMBER;
      l_interface_stg_rec             xx_cst_item_dtls_preint%ROWTYPE;
      l_organization_id               NUMBER;
      l_count                         NUMBER                                   :=0 ;
      l_user_id                       fnd_concurrent_requests.requested_by%TYPE;
      l_inventory_item_id             NUMBER;
      l_resource_id                   NUMBER;
      l_department_id                 NUMBER;
      l_run_option                    VARCHAR2 (3);
--
--EMF Variables
      l_package_name                  xx_emf_message_headers.program_name%TYPE   := 'XX_INVCNV02_COST_UPLOAD_PKG';
      l_program_name                  xx_emf_message_headers.program_name%TYPE   := l_package_name || '.' || 'MAIN';
      l_ricewid                       xx_emf_message_headers.ricew_id%TYPE       := 'INV_CNV_02';       --Object Name
      l_request_id                    xx_emf_message_headers.request_id%TYPE;
      l_error_rec                     xx_emf_message_details%ROWTYPE;                     --used for EMF error header
      l_messages_rec                  xx_emf_message_details%ROWTYPE;                     --used for EMF messages
      l_null_rec                      xx_emf_message_details%ROWTYPE             := NULL; --used for EMF messages
      l_header_id                     xx_emf_message_headers.header_id%TYPE;              --EMF ID
      l_return_value                  NUMBER                                     := NULL; --stores number returned by EMF API's
      l_err_width_rec                 xx_emf.output_rec_type;
      l_data_count                    NUMBER;                       --record type variable for assigning width to error section
      l_processed_recs_itm            NUMBER          := 0; --stores total records for summary report of Item Cost Interface
      l_successful_recs_itm           NUMBER          := 0; --stores total successful records for summary report of Item Cost Interface
      l_error_recs_itm                NUMBER          := 0; --stores total error records for the summary report of Item Cost Interface
      l_processed_recs_rsc            NUMBER          := 0; --stores total records for summary report of Resource Cost Interface
      l_successful_recs_rsc           NUMBER          := 0; --stores total successful records for summary report of Resource Cost Interfaace
      l_error_recs_rsc                NUMBER          := 0; --stores total error records for the summary report of Resource Cost Interface
      l_processed_recs_rohd           NUMBER          := 0; --stores total records for summary report of Resource Overhead Cost Interface
      l_successful_recs_rohd          NUMBER          := 0; --stores total successful records for summary report of Resource Overhead Cost Interface
      l_error_recs_rohd               NUMBER          := 0; --stores total error records for the Resource Overhead summary report
      l_processed_recs_dohd           NUMBER          := 0; --stores total records for summary report of Department Overhead Cost Interface
      l_successful_recs_dohd          NUMBER          := 0; --stores total successful records for summary report of Department Overhead Cost Interface
      l_error_recs_dohd               NUMBER          := 0; --stores total error records for the Department Overhead Cost summary report
      l_status                        xx_emf_message_headers.status%TYPE;  --stores ERROR/WARNING/SUCCESS
      l_error_flag                    VARCHAR2 (1)    := 'N';              --Flag to capture error (Y=ERROR/N=SUCCESS)
      l_warning_flag                  VARCHAR2 (1);                        --Flag to capture warning ('W')
      l_output_message                VARCHAR2 (1000);                     --stores the message returned from external routines
      l_phase                         VARCHAR2 (200);
      l_vstatus                       VARCHAR2 (200);
      l_dev_phase                     VARCHAR2 (200);
      l_dev_status                    VARCHAR2 (200);
      l_message                       VARCHAR2 (2000);
    --
--  Common Validations Variables
--  Exception Variables
      e_emf_initialize_error          EXCEPTION;                          --Stop the program if EMF initialization fails
      e_emf_initialize_detail_error   EXCEPTION;                          --Stop the program with EMF error header insertion fails
      e_cntrl_fail                    EXCEPTION;
   BEGIN
      l_request_id := fnd_profile.VALUE ('CONC_REQUEST_ID');
      l_user_id    := fnd_profile.VALUE ('USER_ID');
/*----------------------------------------------------------------------------------------------------
Initialize Trace
Purpose : Set the program environment for Tracing
-----------------------------------------------------------------------------------------------------*/
      xx_trace.set_program_environment (p_program_name => l_program_name);
/*----------------------------------------------------------------------------------------------------
Initialize EMF Section
Purpose : EMF is initialized so that error can be logged.
-----------------------------------------------------------------------------------------------------*/
      xx_trace.vl ('Entering Program ' || l_program_name);
      --Call to EMF insert_program_start
      l_header_id :=
         xx_emf.insert_program_start (p_program_name      => l_program_name,
                                      p_program_type      => g_program_type,
                                      p_ricew_id          => l_ricewid,
                                      p_request_id        => l_request_id
                                     );

      IF (l_header_id <= 1)
      THEN                                --Header id should be greater than 1
         RAISE e_emf_initialize_error;
      --Raise Exception to Stop the program if EMF initialization fails
      END IF;
      --
      --
      xx_trace.l ('EMF initialized, header_id :' || TO_CHAR (l_header_id));
      --
/*----------------------------------------------------------------------------------------------------
Insert EMF Header
Purpose : To tag the Error labels to EMF columns
-----------------------------------------------------------------------------------------------------*/
      l_error_rec.header_id := l_header_id;
      --
      -- Identifier to locate an error.
      --
      l_error_rec.identifier1 := 'Error Code';            --First Error Header
      l_error_rec.identifier2 := 'Error Message';         --Second Error Header
      l_error_rec.identifier3 := 'Record ID';             --Third Error Header
      l_error_rec.identifier4 := 'Organization Code';     --Fourth Error Header
      l_error_rec.identifier5 := 'Cost Type';             --Fifth Error Header
      l_error_rec.identifier6 := 'Item Number';           --Sixth Error Header
      l_error_rec.identifier7 := 'Resource Code';         --Seventh Error Header
      l_error_rec.identifier8 := 'Department Code';       --Eighth Error Header
      --
      -- Insert error header
      --
      l_return_value :=  xx_emf.insert_error_headers (p_error_rec => l_error_rec);
      --
      IF l_return_value = 1
      THEN                       --(1 indicates Error and 0 indicates Success)
                                 --Raise Exception to Stop the program with 'ERROR' status if EMF error header initilaization fails
         RAISE e_emf_initialize_detail_error;
      END IF;
      --
      xx_trace.l ('EMF Error Header inserted');
      l_return_value := NULL;
   --
/*---------------------------------------------------------------------------------------------------
Call To Purge  Program  xx_emf.purge_ricewid_dated_messages
Purpose : DELETE EMF error records for this  RICE object based on retention period.
----------------------------------------------------------------------------------------------------*/
      l_return_value :=
         xx_emf.purge_ricewid_dated_messages (l_ricewid,
                                              (SYSDATE - g_retention_period
                                              )
                                             );
      --
      IF l_return_value = 1
      THEN
         --
         l_warning_flag := 'W';
         xx_trace.l ('Failed to purge old EMF records');
      --
      END IF;

/*---------------------------------------------------------------------------------------------------
Read Staging Table Data and Perform Control Level Validations
---------------------------------------------------------------------------------------------------*/
--Run mode will decide if the conversion will be run in full run mode 'F' or Partial run mode 'P'.
--IF p_run_mode is 'F the coversion starts with control validation for records with Status 'NW'in staging table
--IF p_run_mode is 'P' the coversion starts with business validation for records with Status 'IP''
--in the pre-interface table. The errored out records of previous run can be fixed in the pre-interface table
--if required and then this program can be run in partial mode .

      IF p_run_mode = 'F'
      THEN             -- --Checking for record count mis-match
   BEGIN
 SELECT COUNT(*)
 INTO l_data_count
 FROM xx_cst_item_upload_stg
 WHERE record_type != 'CNT';
 --
 SELECT DECODE(rec_count,l_data_count,0,1)
 INTO l_data_count
 FROM xx_cst_item_upload_stg
 WHERE record_type = 'CNT';
 --
    IF l_data_count !=0
    THEN
xx_trace.l ('The received data file is not a complete data file.Exiting the program');                              
     --Write to Error                                                          
    xx_emf.call_store_message                                                
     (p_message_group      => 'ERR_DTL'                                      
    , p_header_id          => l_header_id                                    
    , p_debug_value        => 20                 -- low level debugging      
    , p_global_debug       => g_debug_level                                  
    , p_identifier1        => 'E-00001'                                      
    , p_identifier2        => 'The received data file is not a complete data file.Exiting the program'
    , p_identifier3        => NULL
    , p_identifier4        => NULL
    , p_identifier5        => NULL                                          
    , p_identifier6        => NULL                                          
    , p_identifier7        => NULL                                          
    --p_identifier8        => NULL               -- Can be utilized for displaying more information
    , p_process_status     => l_return_value                                
    , p_error_message      => l_output_message                              
     );
    UPDATE XX_CST_ITEM_UPLOAD_STG
    SET    status='ER';

    END IF;
  EXCEPTION
   WHEN OTHERS THEN
 xx_trace.l ('Exception while verifying the record count in the data file.  Exiting the program'
            ||SQLERRM);                              
   --Write to Error                                                          
   xx_emf.call_store_message                                                
     (p_message_group      => 'ERR_DTL'                                      
    , p_header_id          => l_header_id                                    
    , p_debug_value        => 20                 -- low level debugging      
    , p_global_debug       => g_debug_level                                  
    , p_identifier1        => 'E-00001'                                      
    , p_identifier2        => 'Exception while verifying the record count in the data file.  Exiting the program'
                          ||SQLERRM                  
    , p_identifier3        => NULL
    , p_identifier4        => NULL
    , p_identifier5        => NULL                                          
    , p_identifier6        => NULL                                          
    , p_identifier7        => NULL                                          
    --p_identifier8        => NULL              -- Can be utilized for displaying more information
    , p_process_status     => l_return_value                                
    , p_error_message      => l_output_message                              
     );
    UPDATE XX_CST_ITEM_UPLOAD_STG
    SET    status='ER';

  END;
   
        /*************               CONTROL LEVEL VALIDATIONS     *******************/
BEGIN
         FOR c_cst_details_rec IN c_cst_details (p_run_option)
         LOOP
   l_error_flag :='N';
            IF    c_cst_details_rec.record_type = p_run_option OR p_run_option = 'ALL'
            THEN
               --  Validate unconditionally if Organization Code is null
               IF c_cst_details_rec.organization_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Organization Code value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,       -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Organization Code value cannot be null',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               --  Validate unconditionally if Cost Type is null
               IF c_cst_details_rec.cost_type IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Type value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Type value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;                                                       --

               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                     WHERE  record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END IF;
         END LOOP;
--
-- Control validations for Item Cost
         IF p_run_option = 'ITM' OR p_run_option = 'ALL'
         THEN
            --   Validations specific for 'ITM' Cost Load
            FOR c_cst_details_rec IN c_cst_details ('ITM')
            LOOP
               --   Validate if Item Number is null
               IF c_cst_details_rec.item_number IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Item Segment value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Item Segment value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

               --
               -- Validate if Cost Element is null
               IF c_cst_details_rec.cost_element IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
      --
               --   Validate if Usage Rate or Amount is null
               IF c_cst_details_rec.usage_rate_or_amount IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Usage rate or amount value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Usage rate or amount value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                      WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table Status. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
         --
-- Validations specific for 'RSC' Cost Load
         IF p_run_option = 'RSC' OR p_run_option = 'ALL'
         THEN
           FOR c_cst_details_rec IN c_cst_details ('RSC')
            LOOP
               IF c_cst_details_rec.resource_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Resource Code cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Code cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

               --
               IF c_cst_details_rec.resource_rate IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Resource Rate cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,       -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Rate cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

      IF c_cst_details_rec.cost_element IS NOT NULL AND c_cst_details_rec.cost_element != 'Resource'
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value for record type RSC must be Resource.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value for record type RSC must be Resource.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE  xx_cst_item_upload_stg
                        SET  status = 'ER'
                       WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
--
         -- Control Validation for Overhead Cost
         IF p_run_option = 'OHD' OR p_run_option = 'ALL'
         THEN
            FOR c_cst_details_rec IN c_cst_details ('OHD')
            LOOP
               IF  c_cst_details_rec.resource_code IS NULL  AND c_cst_details_rec.department_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('Resource Code and Department Code both cannot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Code and Department Code both cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

      IF  c_cst_details_rec.resource_code IS NOT NULL  AND c_cst_details_rec.overhead_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('For record type OHD if resource code exists then overhead code cannnot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'For record type OHD if resource code exists then overhead code cannnot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

      IF  c_cst_details_rec.department_code IS NOT NULL  AND c_cst_details_rec.overhead_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('For record type OHD if department code exists then overhead code cannnot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'For record type OHD if department code exists then overhead code cannnot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

      IF c_cst_details_rec.cost_element IS NOT NULL AND c_cst_details_rec.cost_element != 'Overhead'
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value for record type OHD must be Overhead.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value for record type OHD must be Overhead.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                      WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
      COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h (   'Exception in Control Validation. Oracle Error :'
                        || SQLERRM
                       );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 40,           -- high level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00001',
                p_identifier2         =>    'Error in Control Validation.'
                                         || SQLERRM,
                p_identifier3         => NULL,         -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

--END of Control Level Validation
/*---------------------------------------------------------------------------------------------------
LOAD DATA INTO PRE-INTERFACE TABLE
---------------------------------------------------------------------------------------------------*/
      BEGIN
         FOR c_cst_details_rec1 IN c_cst_details (p_run_option)
         LOOP
            IF p_run_option = 'ITM' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'ITM')
            THEN
   --
    SELECT XX_CST_ITEM_DTLS_PREINT_S.NEXTVAL
             INTO   l_seq_val1
             FROM   DUAL;
             INSERT INTO XX_CST_ITEM_DTLS_PREINT
                           (status,
   record_id,
   process_flag,
   item_number,
                            organization_code,
                            usage_rate_or_amount,
                            item_cost,
                            cost_type,
                            cost_element,
                            resource_rate,
                            resource_code,
                            department,
                            request_id,
           last_update_date,
           last_updated_by,
                            creation_date,
           created_by,
   last_update_login
                           )
                    VALUES ('IP',
           l_seq_val1,
           1,  --Process Flag has to be set to 1 for processing
                            c_cst_details_rec1.item_number,
                            c_cst_details_rec1.organization_code,
                            c_cst_details_rec1.usage_rate_or_amount,
                            c_cst_details_rec1.item_cost,
                            c_cst_details_rec1.cost_type,
                            c_cst_details_rec1.cost_element,
                            c_cst_details_rec1.resource_rate,
                            c_cst_details_rec1.resource_code,
                            c_cst_details_rec1.department_code,
                            l_request_id,
           SYSDATE,
           l_user_id,
                            SYSDATE,
           l_user_id,
   l_user_id
                           );
             END IF;

            IF p_run_option = 'RSC' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'RSC')
            THEN
   --
     SELECT XX_CST_RESOURCE_COSTS_PREINT_S.NEXTVAL
              INTO   l_seq_val2
              FROM   DUAL;
              INSERT INTO XX_CST_RESOURCE_COSTS_PREINT
                           (status,
   record_id,
           process_flag,
           resource_code,
                            cost_type,
                            organization_code,
                            resource_rate,
                            request_id,
           last_update_date,
           last_updated_by,
                            creation_date,
           created_by,
   last_update_login
                           )
                    VALUES ('IP',
           l_seq_val2,
           1,   --Process Flag has to be set to 1 for processing
                            c_cst_details_rec1.resource_code,
                            c_cst_details_rec1.cost_type,
                            c_cst_details_rec1.organization_code,
                            c_cst_details_rec1.resource_rate,
                            l_request_id, SYSDATE, l_user_id,
                            SYSDATE, l_user_id,l_user_id
                           );
            END IF;

            IF    p_run_option = 'OHD' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'OHD')
            THEN
               IF  c_cst_details_rec1.resource_code IS NOT NULL AND c_cst_details_rec1.overhead_code IS NOT NULL
               THEN
      --
        SELECT XX_CST_RES_OVERHEADS_PREINT_S.NEXTVAL
                 INTO   l_seq_val3
                 FROM   DUAL;
                 INSERT INTO XX_CST_RES_OVERHEADS_PREINT
                              (status,
      record_id,
              process_flag,
              resource_code,
                               cost_type,
                               organization_code,
                               overhead,
                               request_id,
              last_update_date,
                               last_updated_by,
              creation_date,
              created_by,
      last_update_login
                              )
                       VALUES('IP',
              l_seq_val3,
              1,    --Process Flag has to be set to 1 for processing
                               c_cst_details_rec1.resource_code,
                               c_cst_details_rec1.cost_type,
                               c_cst_details_rec1.organization_code,
                               c_cst_details_rec1.overhead_code,
                               l_request_id,
      SYSDATE,
                               l_user_id,
      SYSDATE,
      l_user_id,
      l_user_id
                              );
               END IF;

               IF c_cst_details_rec1.department_code IS NOT NULL
               THEN
      --
        SELECT XX_CST_DEPT_OVERHEADS_PREINT_S.NEXTVAL
                 INTO   l_seq_val4
                 FROM   DUAL;
                 INSERT INTO XX_CST_DEPT_OVERHEADS_PREINT
                              (status,
      record_id,
      process_flag,
      department_code,
                               cost_type,
                               organization_code,
                               overhead,
                               rate_or_amount,
                               request_id,
      last_update_date,
                               last_updated_by,
      creation_date,
      created_by,
      last_update_login
                              )
                       VALUES ('IP',
              l_seq_val4,
              1,  --Process Flag has to be set to 1 for processing
                               c_cst_details_rec1.department_code,
                               c_cst_details_rec1.cost_type,
                               c_cst_details_rec1.organization_code,
                               c_cst_details_rec1.overhead_code,
                               c_cst_details_rec1.rate_or_amount,
                               l_request_id,
      SYSDATE,
                               l_user_id,
      SYSDATE,
      l_user_id,
      l_user_id
                              );
               END IF;
            END IF;
         END LOOP;
         --
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Exception While Inserting Into Pre-Interface table. Oracle Error:'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00002',
                p_identifier2         =>    'Exception While Inserting Into Pre-Interface table.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
      END IF; --p_run_mode = 'F'

/*----------------------------------------------------------------------------
***********         BUSINESS VALIDATIONS      ********************
----------------------------------------------------------------------------*/
      BEGIN
            IF  p_run_option = 'ITM' OR  p_run_option = 'ALL'
            THEN
               FOR c_details_preint_rec IN c_details_preint
               LOOP
                  l_processed_recs_itm := l_processed_recs_itm + 1;   --Counter for total records
                  --
 --Call to procedure for  Item validation
                  XX_COMMON_VALIDATION_PRC
                                     (c_details_preint_rec.organization_code,
                                      c_details_preint_rec.cost_type,
                                      l_header_id,
                                      l_error_flag
                                     );
                  XX_VALIDATE_ITM_COST_PRC (c_details_preint_rec,
                                            l_header_id,
                                            l_error_flag
                                           );
                  -- Updating pre interface table with status 'ER' where record_status in('NW','PF')
                  -- Update Item Cost Pre-Interface Table
                  IF l_error_flag = 'Y'
                  THEN
                     BEGIN
                        --Update Details Pre-Interface
                        UPDATE XX_CST_ITEM_DTLS_PREINT
                           SET status = 'ER'
                         WHERE item_number       = c_details_preint_rec.item_number
                           AND organization_code = c_details_preint_rec.organization_code
  AND record_id         = c_details_preint_rec.record_id;
    --
    EXCEPTION
                        WHEN OTHERS
                        THEN
                           l_error_flag := 'Y';
                           xx_trace.h
                              (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                               || SQLERRM
                              );
                           xx_emf.call_store_message
                              (p_message_group       => 'ERR_DTL',
                               p_header_id           => l_header_id,
                               p_debug_value         => 40,     -- High level debugging
                               p_global_debug        => g_debug_level,
                               p_identifier1         => 'E-12300',
                               p_identifier2         => 'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                        || SQLERRM,
                               p_identifier3         => c_details_preint_rec.record_id,
                               p_identifier4         => c_details_preint_rec.organization_code,
                               p_identifier5         => c_details_preint_rec.cost_type,
                               p_identifier6         => c_details_preint_rec.item_number,
                              -- p_identifier7       => c_details_preint_rec.resource_code,
                              -- p_identifier8       => c_details_preint_rec.department_code,
                               p_process_status      => l_return_value,
                               p_error_message       => l_output_message
                              );
                     END;
                  ELSE
                     l_successful_recs_itm := l_successful_recs_itm + 1;
                  END IF;
                     l_error_flag := 'N';
               END LOOP;
            END IF;
            --
            -- Businesss Validation for Resource Cost Table
            IF  p_run_option = 'RSC'  OR  p_run_option = 'ALL'
            THEN
               FOR c_cost_resource_rec IN c_cost_resource
               LOOP
                  l_processed_recs_rsc := l_processed_recs_rsc + 1; --Counter for total records
                  -- Call to procedure for validation
                  XX_COMMON_VALIDATION_PRC
                                      (c_cost_resource_rec.organization_code,
                                       c_cost_resource_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                  XX_VALIDATE_RSC_COST_PRC (c_cost_resource_rec,
                                            l_header_id,
                                            l_error_flag
                                           );
                  IF l_error_flag = 'Y'
                  THEN
                     BEGIN
                        --Update Resource Cost Pre-Interface Table
                        UPDATE XX_CST_RESOURCE_COSTS_PREINT
                           SET status = 'ER'
                         WHERE resource_rate     = c_cost_resource_rec.resource_rate
                           AND organization_code = c_cost_resource_rec.organization_code
  AND record_id         = c_cost_resource_rec.record_id;
                     EXCEPTION
                        WHEN OTHERS
                        THEN
                           l_error_flag := 'Y';
                           xx_trace.h
                              (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                               || SQLERRM
                              );
                           xx_emf.call_store_message
                              (p_message_group       => 'ERR_DTL',
                               p_header_id           => l_header_id,
                               p_debug_value         => 40,   -- High level debugging
                               p_global_debug        => g_debug_level,
                               p_identifier1         => 'E-12300',
                               p_identifier2         =>    'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                        || SQLERRM,
                               p_identifier3         => c_cost_resource_rec.record_id,
                               p_identifier4         => c_cost_resource_rec.organization_code,
                               p_identifier5         => c_cost_resource_rec.cost_type,
                              -- p_identifier6       => c_cost_resource_rec.item_number,
                               p_identifier7         => c_cost_resource_rec.resource_code,
                              -- p_identifier8       => c_cost_resource_rec.department_code,
                               p_process_status      => l_return_value,
                               p_error_message       => l_output_message
                              );
                     END;
                  ELSE
                     l_successful_recs_rsc := l_successful_recs_rsc + 1;
                  END IF;
    l_error_flag := 'N';
               END LOOP;
            END IF;

            -- Businesss Validation for Resource Overhead Table
            IF p_run_option = 'OHD' OR p_run_option = 'ALL'
            THEN
               FOR c_resc_overhead_rec IN c_resc_overhead
               LOOP
                  IF c_resc_overhead_rec.overhead IS NOT NULL AND c_resc_overhead_rec.resource_code IS NOT NULL
                  THEN
                     l_processed_recs_rohd := l_processed_recs_rohd + 1;    --Counter for total records
                     -- Call to procedure for validation
                     XX_COMMON_VALIDATION_PRC
                                      (c_resc_overhead_rec.organization_code,
                                       c_resc_overhead_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                     XX_VALIDATE_RSC_OHD_PRC (c_resc_overhead_rec,
                                              l_header_id,
                                              l_error_flag
                                             );
                     IF l_error_flag = 'Y'
                     THEN
                        BEGIN
                           --Update Resource Overhead Pre-Interface Table
                           UPDATE XX_CST_RES_OVERHEADS_PREINT
                              SET status = 'ER'
                            WHERE resource_code     = c_resc_overhead_rec.resource_code
                              AND overhead          = c_resc_overhead_rec.overhead
                              AND organization_code = c_resc_overhead_rec.organization_code
     AND record_id         = c_resc_overhead_rec.record_id;
                        EXCEPTION
                           WHEN OTHERS
                           THEN
                              l_error_flag := 'Y';
                              xx_trace.h
                                 (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                  || SQLERRM
                                 );
                              xx_emf.call_store_message
                                 (p_message_group       => 'ERR_DTL',
                                  p_header_id           => l_header_id,
                                  p_debug_value         => 40,  -- High level debugging
                                  p_global_debug        => g_debug_level,
                                  p_identifier1         => 'E-12300',
                                  p_identifier2         => 'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                           || SQLERRM,
                                  p_identifier3         => c_resc_overhead_rec.record_id,
                                  p_identifier4         => c_resc_overhead_rec.organization_code,
                                  p_identifier5         => c_resc_overhead_rec.cost_type,
                                  -- p_identifier6      => c_resc_overhead_rec.item_number,
                                  p_identifier7         => c_resc_overhead_rec.resource_code,
                                  --p_identifier8       => c_resc_overhead_rec.department_code,
                                  p_process_status      => l_return_value,
                                  p_error_message       => l_output_message
                                 );
                        END;
                     ELSE
                        l_successful_recs_rohd := l_successful_recs_rohd + 1;
                     END IF;
                        l_error_flag := 'N';
                  END IF;
               END LOOP;
            END IF;

            -- Businesss Validation for Department Overhead Table
            IF p_run_option = 'OHD' OR p_run_option = 'ALL'
            THEN
               FOR c_dept_overhead_rec IN c_dept_overhead
               LOOP
                  IF c_dept_overhead_rec.overhead IS NOT NULL AND c_dept_overhead_rec.department_code IS NOT NULL
                  THEN
                     l_processed_recs_dohd := l_processed_recs_dohd + 1;     --Counter for total records
                     -- Call to procedure for validation
                     XX_COMMON_VALIDATION_PRC
                                      (c_dept_overhead_rec.organization_code,
                                       c_dept_overhead_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                     XX_VALIDATE_DEPT_OHD_PRC (c_dept_overhead_rec,
                                               l_header_id,
                                               l_error_flag
                                              );
                     IF l_error_flag = 'Y'
                     THEN
                        BEGIN
                           --Update Department Overhead Pre-Interface Table
                           UPDATE XX_CST_DEPT_OVERHEADS_PREINT
                              SET status = 'ER'
                            WHERE department_code   = c_dept_overhead_rec.department_code
                              AND overhead          = c_dept_overhead_rec.overhead
                              AND organization_code = c_dept_overhead_rec.organization_code
     AND record_id         = c_dept_overhead_rec.record_id;
                        EXCEPTION
                           WHEN OTHERS
                           THEN
                              l_error_flag := 'Y';
                              xx_trace.h
                                 (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                  || SQLERRM
                                 );
                              xx_emf.call_store_message
                                 (p_message_group       => 'ERR_DTL',
                                  p_header_id           => l_header_id,
                                  p_debug_value         => 40,           -- High level debugging
                                  p_global_debug        => g_debug_level,
                                  p_identifier1         => 'E-12300',
                                  p_identifier2         =>    'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                           || SQLERRM,
                                  p_identifier3         => c_dept_overhead_rec.record_id,
                                  p_identifier4         => c_dept_overhead_rec.organization_code,
                                  p_identifier5         => c_dept_overhead_rec.cost_type,
                                 -- p_identifier6       => c_dept_overhead_rec.item_number,
                                 -- p_identifier7       => c_dept_overhead_rec.resource_code,
                                  p_identifier8         => c_dept_overhead_rec.department_code,
                                  p_process_status      => l_return_value,
                                  p_error_message       => l_output_message
                                 );
                        END;
                     ELSE
                        l_successful_recs_dohd := l_successful_recs_dohd + 1;
                     END IF;
                        l_error_flag := 'N';
                  END IF;
               END LOOP;
            END IF;
        --
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Unexpected Exception While Business Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 40,           -- High level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-12300',
                p_identifier2         =>    'Unexpected Exception While Business Validation.Oracle Error-'
                                         || SQLERRM,
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

--End of Business Validation Section
/*---------------------------------------------------------------------------------------
Move data into Oracle Interface Table / Public API
---------------------------------------------------------------------------------------*/
-- Insert all data into oracle interface table from pre interface table
      BEGIN
         IF p_run_option = 'ITM' OR p_run_option = 'ALL'
         THEN
            FOR c_details_preint_rec IN c_details_preint
            LOOP
               --deriving inventory_item_id
               BEGIN
                  SELECT   msi.inventory_item_id
                    INTO   l_inventory_item_id
                    FROM   mtl_system_items_b   msi
          , mtl_parameters     mp
                   WHERE   msi.segment1         = c_details_preint_rec.item_number
                     AND   mp.organization_id   = msi.organization_id
                     AND   mp.organization_code = c_details_preint_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Inventory item id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,  -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         => 'Exception While Retrieving Inventory item id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_details_preint_rec.record_id,
                         p_identifier4         => c_details_preint_rec.organization_code,
                         p_identifier5         => c_details_preint_rec.cost_type,
                         p_identifier6         => c_details_preint_rec.item_number,
                         p_identifier7         => c_details_preint_rec.resource_code,
                         -- p_identifier8      => c_details_preint_rec.department_code,
p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
               --
               INSERT INTO CST_ITEM_CST_DTLS_INTERFACE
                           (inventory_item_id,
                            cost_type_id,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            organization_id,
                            operation_sequence_id,
                            operation_seq_num,
                            department_id,
                            level_type,
                            activity_id,
                            resource_seq_num,
                            resource_id,
                            resource_rate,
                            item_units,
                            activity_units,
                            usage_rate_or_amount,
                            basis_type,
                            basis_resource_id,
                            basis_factor,
                            net_yield_or_shrinkage_factor,
                            item_cost,
                            cost_element_id,
                            rollup_source_type,
                            activity_context,
                            request_id,
                            organization_code,
                            cost_type,
                            inventory_item,
                            department,
                            activity,
                            resource_code,
                            basis_resource_code,
                            cost_element,
                            ERROR_TYPE,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            transaction_id,
                            process_flag,
                            item_number,
                            transaction_type,
                            yielded_cost,
                            ERROR_CODE,
                            error_explanation,
                            lot_size,
                            based_on_rollup_flag,
                            shrinkage_rate,
                            inventory_asset_flag,
                            error_flag,
                            group_description
                           )
                    VALUES (l_inventory_item_id,
                            c_details_preint_rec.cost_type_id,
                            c_details_preint_rec.last_update_date,
                            c_details_preint_rec.last_updated_by,
                            c_details_preint_rec.creation_date,
                            c_details_preint_rec.created_by,
                            c_details_preint_rec.last_update_login,
                            c_details_preint_rec.GROUP_ID,
                            c_details_preint_rec.organization_id,
                            c_details_preint_rec.operation_sequence_id,
                            c_details_preint_rec.operation_seq_num,
                            c_details_preint_rec.department_id,
                            c_details_preint_rec.level_type,
                            c_details_preint_rec.activity_id,
                            c_details_preint_rec.resource_seq_num,
                            c_details_preint_rec.resource_id,
                            c_details_preint_rec.resource_rate,
                            c_details_preint_rec.item_units,
                            c_details_preint_rec.activity_units,
                            c_details_preint_rec.usage_rate_or_amount,
                            c_details_preint_rec.basis_type,
                            c_details_preint_rec.basis_resource_id,
                            c_details_preint_rec.basis_factor,
                            c_details_preint_rec.net_yield_or_shrinkage_factor,
                            c_details_preint_rec.item_cost,
                            c_details_preint_rec.cost_element_id,
                            c_details_preint_rec.rollup_source_type,
                            c_details_preint_rec.activity_context,
                            c_details_preint_rec.request_id,
                            c_details_preint_rec.organization_code,
                            c_details_preint_rec.cost_type,
                            c_details_preint_rec.inventory_item_id,
                            c_details_preint_rec.department,
                            c_details_preint_rec.activity,
                            c_details_preint_rec.resource_code,
                            c_details_preint_rec.basis_resource_code,
                            c_details_preint_rec.cost_element,
                            c_details_preint_rec.ERROR_TYPE,
                            c_details_preint_rec.program_application_id,
                            c_details_preint_rec.program_id,
                            c_details_preint_rec.program_update_date,
                            c_details_preint_rec.attribute_category,
                            c_details_preint_rec.attribute1,
                            c_details_preint_rec.attribute2,
                            c_details_preint_rec.attribute3,
                            c_details_preint_rec.attribute4,
                            c_details_preint_rec.attribute5,
                            c_details_preint_rec.attribute6,
                            c_details_preint_rec.attribute7,
                            c_details_preint_rec.attribute8,
                            c_details_preint_rec.attribute9,
                            c_details_preint_rec.attribute10,
                            c_details_preint_rec.attribute11,
                            c_details_preint_rec.attribute12,
                            c_details_preint_rec.attribute13,
                            c_details_preint_rec.attribute14,
                            c_details_preint_rec.attribute15,
                            c_details_preint_rec.transaction_id,
                            c_details_preint_rec.process_flag,
                            c_details_preint_rec.item_number,
                            c_details_preint_rec.transaction_type,
                            c_details_preint_rec.yielded_cost,
                            c_details_preint_rec.ERROR_CODE,
                            c_details_preint_rec.error_explanation,
                            c_details_preint_rec.lot_size,
                            c_details_preint_rec.based_on_rollup_flag,
                            c_details_preint_rec.shrinkage_rate,
                            c_details_preint_rec.inventory_asset_flag,
                            c_details_preint_rec.error_flag,
                            c_details_preint_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         --
         IF p_run_option = 'RSC' OR p_run_option = 'ALL'
         THEN
            FOR c_cost_resource_rec IN c_cost_resource
            LOOP
               --deriving resource_id
               BEGIN
                  SELECT   resource_id
                    INTO   l_resource_id
                    FROM   bom_resources br
  ,org_organization_definitions  ood
                   WHERE   ood.organization_id   = br.organization_id
    AND   resource_code         = c_cost_resource_rec.resource_code
                     AND   ood.organization_code = c_cost_resource_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Resource id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,           -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         =>    'Exception While Retrieving Resource id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_cost_resource_rec.record_id,
                         p_identifier4         => c_cost_resource_rec.organization_code,
                         p_identifier5         => c_cost_resource_rec.cost_type,
                         -- p_identifier6      => c_cost_resource_rec.item_number,
                         --p_identifier7       => c_cost_resource_rec.resource_code,
                         --p_identifier8       => c_cost_resource_rec.department_code,
                         p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
               --
               INSERT INTO CST_RESOURCE_COSTS_INTERFACE
                           (resource_id, resource_code,
                            cost_type_id,
                            cost_type,
                            organization_id,
                            organization_code,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            transaction_id,
                            process_flag,
                            resource_rate,
                            request_id,
                            ERROR_CODE,
                            error_explanation,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            error_flag,
                            group_description
                           )
                    VALUES (l_resource_id,
   c_cost_resource_rec.resource_code,
                            c_cost_resource_rec.cost_type_id,
                            c_cost_resource_rec.cost_type,
                            c_cost_resource_rec.organization_id,
                            c_cost_resource_rec.organization_code,
                            c_cost_resource_rec.last_update_date,
                            c_cost_resource_rec.last_updated_by,
                            c_cost_resource_rec.creation_date,
                            c_cost_resource_rec.created_by,
                            c_cost_resource_rec.last_update_login,
                            c_cost_resource_rec.GROUP_ID,
                            c_cost_resource_rec.transaction_id,
                            c_cost_resource_rec.process_flag,
                            c_cost_resource_rec.resource_rate,
                            c_cost_resource_rec.request_id,
                            c_cost_resource_rec.ERROR_CODE,
                            c_cost_resource_rec.error_explanation,
                            c_cost_resource_rec.program_application_id,
                            c_cost_resource_rec.program_id,
                            c_cost_resource_rec.program_update_date,
                            c_cost_resource_rec.attribute_category,
                            c_cost_resource_rec.attribute1,
                            c_cost_resource_rec.attribute2,
                            c_cost_resource_rec.attribute3,
                            c_cost_resource_rec.attribute4,
                            c_cost_resource_rec.attribute5,
                            c_cost_resource_rec.attribute6,
                            c_cost_resource_rec.attribute7,
                            c_cost_resource_rec.attribute8,
                            c_cost_resource_rec.attribute9,
                            c_cost_resource_rec.attribute10,
                            c_cost_resource_rec.attribute11,
                            c_cost_resource_rec.attribute12,
                            c_cost_resource_rec.attribute13,
                            c_cost_resource_rec.attribute14,
                            c_cost_resource_rec.attribute15,
                            c_cost_resource_rec.error_flag,
                            c_cost_resource_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         --
         --
         IF p_run_option = 'OHD' OR p_run_option = 'ALL'
         THEN
            FOR c_resc_overhead_rec IN c_resc_overhead
            LOOP
               --deriving resource_id
               IF c_resc_overhead_rec.resource_code IS NOT NULL
               THEN
                  BEGIN
                     SELECT   resource_id
                       INTO   l_resource_id
                       FROM   bom_resources br
     ,org_organization_definitions  ood
                      WHERE   br.organization_id    = ood.organization_id
AND   br.resource_code      = c_resc_overhead_rec.resource_code
                        AND   ood.organization_code = c_resc_overhead_rec.organization_code;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.h
                           (   ' Exception While Retrieving Resource id.Oracle Error-'
                            || SQLERRM
                           );
                        xx_emf.call_store_message
                           (p_message_group       => 'ERR_DTL',
                            p_header_id           => l_header_id,
                            p_debug_value         => 40,    -- High level debugging
                            p_global_debug        => g_debug_level,
                            p_identifier1         => 'E-12300',
                            p_identifier2         =>    'Exception While Retrieving Resource id.Oracle Error-'
                                                     || SQLERRM,
                            p_identifier3         => c_resc_overhead_rec.record_id,
                            p_identifier4         => c_resc_overhead_rec.organization_code,
                            p_identifier5         => c_resc_overhead_rec.cost_type,
                            -- p_identifier6      => c_resc_overhead_rec.item_number,
                            p_identifier7         => c_resc_overhead_rec.resource_code,
                            -- p_identifier8      => c_resc_overhead_rec.department_code,
                            p_process_status      => l_return_value,
                            p_error_message       => l_output_message
                           );
                  END;
               END IF;
               --
               INSERT INTO CST_RES_OVERHEADS_INTERFACE
                           (resource_id, resource_code,
                            cost_type_id,
                            cost_type,
                            organization_id,
                            organization_code,
                            overhead_id,
                            overhead,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            transaction_id,
                            process_flag,
                            request_id,
                            ERROR_CODE,
                            error_explanation,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            error_flag,
                            group_description
                           )
                    VALUES (l_resource_id,
           c_resc_overhead_rec.resource_code,
                            c_resc_overhead_rec.cost_type_id,
                            c_resc_overhead_rec.cost_type,
                            c_resc_overhead_rec.organization_id,
                            c_resc_overhead_rec.organization_code,
                            c_resc_overhead_rec.overhead_id,
                            c_resc_overhead_rec.overhead,
                            c_resc_overhead_rec.last_update_date,
                            c_resc_overhead_rec.last_updated_by,
                            c_resc_overhead_rec.creation_date,
                            c_resc_overhead_rec.created_by,
                            c_resc_overhead_rec.last_update_login,
                            c_resc_overhead_rec.GROUP_ID,
                            c_resc_overhead_rec.transaction_id,
                            c_resc_overhead_rec.process_flag,
                            c_resc_overhead_rec.request_id,
                            c_resc_overhead_rec.ERROR_CODE,
                            c_resc_overhead_rec.error_explanation,
                            c_resc_overhead_rec.program_application_id,
                            c_resc_overhead_rec.program_id,
                            c_resc_overhead_rec.program_update_date,
                            c_resc_overhead_rec.attribute_category,
                            c_resc_overhead_rec.attribute1,
                            c_resc_overhead_rec.attribute2,
                            c_resc_overhead_rec.attribute3,
                            c_resc_overhead_rec.attribute4,
                            c_resc_overhead_rec.attribute5,
                            c_resc_overhead_rec.attribute6,
                            c_resc_overhead_rec.attribute7,
                            c_resc_overhead_rec.attribute8,
                            c_resc_overhead_rec.attribute9,
                            c_resc_overhead_rec.attribute10,
                            c_resc_overhead_rec.attribute11,
                            c_resc_overhead_rec.attribute12,
                            c_resc_overhead_rec.attribute13,
                            c_resc_overhead_rec.attribute14,
                            c_resc_overhead_rec.attribute15,
                            c_resc_overhead_rec.error_flag,
                            c_resc_overhead_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         FOR c_dept_overhead_rec IN c_dept_overhead
         LOOP
            --deriving resource_id
            IF (c_dept_overhead_rec.department_code IS NOT NULL)
            THEN
               BEGIN
                  --
                  SELECT   department_id
                    INTO   l_department_id
                    FROM   bom_departments    bd
  ,org_organization_definitions ood
                   WHERE   bd.organization_id    = ood.organization_id
    AND   bd.department_code    = c_dept_overhead_rec.department_code
                     AND   ood.organization_code = c_dept_overhead_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Department id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,      -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         => 'Exception While Retrieving Department id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_dept_overhead_rec.record_id,
                         p_identifier4         => c_dept_overhead_rec.organization_code,
                         p_identifier5         => c_dept_overhead_rec.cost_type,
                         -- p_identifier6      => c_dept_overhead_rec.item_number,
                         --p_identifier7       => c_dept_overhead_rec.resource_code,
                         p_identifier8         => c_dept_overhead_rec.department_code,
                         p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
            END IF;
            --
            INSERT INTO CST_DEPT_OVERHEADS_INTERFACE
                        (department_id,
                         department_code,
                         cost_type_id,
                         cost_type,
                         organization_id,
                         organization_code,
                         overhead_id,
                         overhead,
                         last_update_date,
                         last_updated_by,
                         creation_date,
                         created_by,
                         last_update_login,
                         GROUP_ID,
                         transaction_id,
                         process_flag,
                         basis_type,
                         rate_or_amount,
                         activity_id,
                         activity,
                         request_id,
                         ERROR_CODE,
                         error_explanation,
                         program_application_id,
                         program_id,
                         program_update_date,
                         attribute_category,
                         attribute1,
                         attribute2,
                         attribute3,
                         attribute5,
                         attribute6,
                         attribute7,
                         attribute8,
                         attribute9,
                         attribute10,
                         attribute11,
                         attribute12,
                         attribute13,
                         attribute14,
                         attribute15,
                         error_flag,
                         group_description
                        )
                 VALUES (l_department_id,
                         c_dept_overhead_rec.department_code,
                         c_dept_overhead_rec.cost_type_id,
                         c_dept_overhead_rec.cost_type,
                         c_dept_overhead_rec.organization_id,
                         c_dept_overhead_rec.organization_code,
                         c_dept_overhead_rec.overhead_id,
                         c_dept_overhead_rec.overhead,
                         c_dept_overhead_rec.last_update_date,
                         c_dept_overhead_rec.last_updated_by,
                         c_dept_overhead_rec.creation_date,
                         c_dept_overhead_rec.created_by,
                         c_dept_overhead_rec.last_update_login,
                         c_dept_overhead_rec.GROUP_ID,
                         c_dept_overhead_rec.transaction_id,
                         c_dept_overhead_rec.process_flag,
                         c_dept_overhead_rec.basis_type,
                         c_dept_overhead_rec.rate_or_amount,
                         c_dept_overhead_rec.activity_id,
                         c_dept_overhead_rec.activity,
                         c_dept_overhead_rec.request_id,
                         c_dept_overhead_rec.ERROR_CODE,
                         c_dept_overhead_rec.error_explanation,
                         c_dept_overhead_rec.program_application_id,
                         c_dept_overhead_rec.program_id,
                         c_dept_overhead_rec.program_update_date,
                         c_dept_overhead_rec.attribute_category,
                         c_dept_overhead_rec.attribute1,
                         c_dept_overhead_rec.attribute2,
                         c_dept_overhead_rec.attribute3,
                         c_dept_overhead_rec.attribute5,
                         c_dept_overhead_rec.attribute6,
                         c_dept_overhead_rec.attribute7,
                         c_dept_overhead_rec.attribute8,
                         c_dept_overhead_rec.attribute9,
                         c_dept_overhead_rec.attribute10,
                         c_dept_overhead_rec.attribute11,
                         c_dept_overhead_rec.attribute12,
                         c_dept_overhead_rec.attribute13,
                         c_dept_overhead_rec.attribute14,
                         c_dept_overhead_rec.attribute15,
                         c_dept_overhead_rec.error_flag,
                         c_dept_overhead_rec.group_description
                        );
         END LOOP;
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Exception While Inserting into Interface Table.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00004',
                p_identifier2         => 'Exception While Inserting into INTERFACE TABLE.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            RAISE;
      END;

/*----------------------------------------------------------------------------------
    --Updating pre interface table with status 'PR' where record_status in IP'
  ----------------------------------------------------------------------------------*/
      --Update Item Cost Details Preinterface Table
      IF p_run_option = 'ITM' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_ITEM_DTLS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Resource Cost Preinterface Table
      IF p_run_option = 'RSC' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_RESOURCE_COSTS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Resource Overhead Preinterface Table
      IF p_run_option = 'OHD' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_RES_OVERHEADS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Department Overhead Preinterface Table
      IF p_run_option = 'OHD' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_DEPT_OVERHEADS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;

      --Initialize apps
      --fnd_global.apps_initialize (l_user_id, l_resp_id, l_appl_id);
      XX_COMMON_VALIDATIONS_PKG.INIT_APPS_PARAMS
                                        (p_request_id          => l_request_id,
                                         p_process_status      => l_process_status,
                                         p_error_message       => l_output_message
                                        );

/*---------------------------------------------------------------------------------------
Launch Standard Concurrent Program - With WAIT/Call Oracle Standard APIs
----------------------------------------------------------------------------------------*/
     BEGIN
     SELECT COUNT (*)
     INTO l_count
     FROM XX_CST_ITEM_DTLS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_RESOURCE_COSTS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_RES_OVERHEADS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_DEPT_OVERHEADS_PREINT
     WHERE status = 'PR';
 --
 --
         IF l_count > 0
         THEN
            SELECT  DECODE (p_run_option, 'ITM', 1, 'RSC', 2, 'OHD', 3, 4)
              INTO  l_run_option
              FROM  DUAL;
               --
      l_standard_request_id :=
               fnd_request.submit_request
                             (application      => 'BOM',
                              program          => 'CSTPCIMP',
                              description      => NULL,
                              start_time       => NULL,
                              sub_request      => FALSE,
                              argument1        => l_run_option,  -- Import cost option
                              argument2        => 2,             -- Mode to run this request
                              argument3        => 2,             -- Group ID option
                              argument4        => NULL,          -- Group ID Dummy
                              argument5        => NULL,          -- Group ID
                              argument6        => p_cost_type,   -- Cost type to import to
                              argument7        => 2              -- Delete successful rows
                             );
            COMMIT;
         
            --Wait for the completion of the concurrent request (if submitted successfully)
            l_completed :=
               fnd_concurrent.wait_for_request
                                         (request_id      => l_standard_request_id,
                                          INTERVAL        => 60,
                                          max_wait        => 0,
                                          phase           => l_phase,
                                          status          => l_vstatus,
                                          dev_phase       => l_dev_phase,
                                          dev_status      => l_dev_status,
                                          MESSAGE         => l_message
                                         );
            xx_trace.l (   'Request submitted with request id-'
                        || l_standard_request_id
                       );
         ELSE
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- Low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00004',
                p_identifier2         => 'No records To Process in Interface Table',
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         END IF;
      END;
 /*----------------------------------------------------------------------------
 Delete the Processed records from the Pre-interface table
 ----------------------------------------------------------------------------*/
    BEGIN
      IF ((p_run_option = 'ALL') OR (p_run_option = 'ITM'))
      THEN
        DELETE FROM XX_CST_ITEM_DTLS_PREINT
        WHERE status = 'PR';
      END IF;
      --
      IF ((p_run_option = 'ALL') OR (p_run_option = 'RSC'))
      THEN
        DELETE FROM XX_CST_RESOURCE_COSTS_PREINT
        WHERE status = 'PR';
      END IF;
      --
      IF ((p_run_option = 'ALL') OR (p_run_option = 'OHD'))
      THEN
        DELETE FROM XX_CST_RES_OVERHEADS_PREINT
        WHERE status = 'PR';
        DELETE FROM XX_CST_DEPT_OVERHEADS_PREINT
        WHERE status = 'PR';
      END IF;
      --
    EXCEPTION
      WHEN OTHERS
      THEN
        xx_trace.h
          (' Exception While deleting processed records from Pre-Interface Table(s)'
           || SQLERRM
          );
        xx_emf.call_store_message
          (p_message_group      => 'ERR_DTL'
         , p_header_id          => l_header_id
         , p_debug_value        => 40   -- High level debugging
         , p_global_debug       => g_debug_level
         , p_identifier1        => 'E-00004'
         , p_identifier2        => ' Exception While deleting processed records from Pre-Interface Table(s)'
                                   || SQLERRM
         , p_identifier3        => NULL -- Can be utilized to store record serial number
         , p_process_status     => l_return_value
         , p_error_message      => l_output_message
          );
    END;
/*----------------------------------------------------------------------------
 Call Insert Summary Count
 Purpose: Display a summary of records processed, successful and in error
 ----------------------------------------------------------------------------*/
    IF ((p_run_option = 'ALL') OR (p_run_option = 'ITM'))
    THEN
      l_error_recs_itm := l_processed_recs_itm - l_successful_recs_itm;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Item Cost)'
                                  , p_total_recs          => l_processed_recs_itm
                                  , p_successful_recs     => l_successful_recs_itm
                                  , p_error_recs          => l_error_recs_itm
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Item Cost');
      END IF;
      --
    END IF;
    --
    IF ((p_run_option = 'ALL') OR (p_run_option = 'RSC'))
    THEN
      l_error_recs_rsc := l_processed_recs_rsc - l_successful_recs_rsc;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Resource Cost)'
                                  , p_total_recs          => l_processed_recs_rsc
                                  , p_successful_recs     => l_successful_recs_rsc
                                  , p_error_recs          => l_error_recs_rsc
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Resource Cost');
      END IF;
      --
    END IF;
    --
    IF ((p_run_option = 'ALL') OR (p_run_option = 'OHD'))
    THEN
      l_error_recs_rohd := l_processed_recs_rohd - l_successful_recs_rohd;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Resource Overhead)'
                                  , p_total_recs          => l_processed_recs_rohd
                                  , p_successful_recs     => l_successful_recs_rohd
                                  , p_error_recs          => l_error_recs_rohd
                                   );

      l_error_recs_dohd := l_processed_recs_dohd - l_successful_recs_dohd;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Department Overhead)'
                                  , p_total_recs          => l_processed_recs_dohd
                                  , p_successful_recs     => l_successful_recs_dohd
                                  , p_error_recs          => l_error_recs_dohd
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Overhead Cost');
      END IF;
      --
     END IF;

/*-----------------------------------------------------------------------------------------
      Call flush PL/SQL table section
      Purpose : Flush data from pl/sql table isrespective of the count.
      Special Logic : record's message group is passed as 'ALL' and rest all columns are null
-------------------------------------------------------------------------------------------*/
      xx_emf.call_store_message (p_message_group       => 'ALL',
                                 p_header_id           => l_header_id,
                                 p_debug_value         => 20,
                                 p_global_debug        => g_debug_level,
                                 p_identifier1         => 'Flushing Data into EMF',
                                 p_process_status      => l_return_value,
                                 p_error_message       => l_output_message
                                );

      IF l_return_value = 1
      THEN
         l_warning_flag := 'W';
         xx_trace.l ('Failed to print EMF messages on the output');
      END IF;

      --
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
/*----------------------------------------------------------------------------
    Set display width for output
    Purpose: Call to set EMF error and report section column widths
 --------------------------------------------------------------------------*/
      l_err_width_rec.identifier1 := TO_CHAR (g_err_col1_width);
      l_err_width_rec.identifier2 := TO_CHAR (g_err_col2_width);
      l_err_width_rec.identifier3 := TO_CHAR (g_err_col3_width);
      l_err_width_rec.identifier4 := TO_CHAR (g_err_col4_width);
      l_err_width_rec.identifier5 := TO_CHAR (g_err_col5_width);
      l_err_width_rec.identifier6 := TO_CHAR (g_err_col6_width);
      l_err_width_rec.identifier7 := TO_CHAR (g_err_col7_width);
      l_err_width_rec.identifier8 := TO_CHAR (g_err_col8_width);
     --
/*----------------------------------------------------------------
    Call to xx_emf.display_output_messages
       Purpose--Call to generate output file (Errors/Messages)
--------------------------------------------------------------*/
      l_err_width_rec.header_id := l_header_id;
      l_return_value :=
         xx_emf.display_output_messages (p_header_id          => l_header_id,
                                         p_err_width_rec      => l_err_width_rec
                                        );

      IF l_return_value = 1
      THEN
         l_error_flag := 'Y';
         xx_trace.l ('Failed to display output messages');
      END IF;

      --
      l_return_value := NULL;

    --
/*---------------------------------------------------
    Call ToEMF Update_program_status in EMF tables
-----------------------------------------------------*/
      IF l_error_flag = 'Y'
      THEN                                                             --ERROR
         l_warning_flag := '';              --error status supercedes warning
         l_status := 'ERROR';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status');
            l_return_value := NULL;
         END IF;
      ELSIF l_warning_flag = 'W'
      THEN
         l_status := 'WARNING';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status');
            l_return_value := NULL;
         END IF;
      ELSIF l_error_flag = 'N'
      THEN
         l_status := 'SUCCESS';
         l_return_value := NULL;
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status for Success');
         END IF;

         COMMIT;
      END IF;
   EXCEPTION                                                  --Main Exception
   --Call emf_initialize_error if EMF header fails
      WHEN e_emf_initialize_error
      THEN
         xx_trace.l ('Failed to initialize EMF');
   --Call emf_initialize_detail_error if EMF error/report detail fails
      WHEN e_emf_initialize_detail_error
      THEN
         l_status := 'ERROR';
         l_return_value :=
                         xx_emf.update_program_status (l_header_id, l_status);
         xx_trace.l ('Failed to insert EMF error header');
   --Main Exception Block
      WHEN OTHERS
      THEN
--Write to error
         l_error_flag := 'Y';
         xx_emf.call_store_message
                                  (p_message_group       => 'ERR_DTL',
                                   p_header_id           => l_header_id,
                                   p_debug_value         => 40,         --High level debugging
                                   p_global_debug        => g_debug_level,
                                   p_identifier1         => 'E-00004',
                                   p_identifier2         =>    'Exception in Main.'
                                                            || SQLERRM
                                                            || SQLERRM,
                                   p_process_status      => l_return_value,
                                   p_error_message       => l_output_message
                                  );
         --
         l_messages_rec := l_null_rec;
         l_return_value := NULL;

/*-----------------------------------------------------------------------------------------
    Call flush PL/SQL table section
    Purpose : Flush data from pl/sql table isrespective of the count.
    Special Logic : record's message group is passed as 'ALL' and rest all columns are null
-------------------------------------------------------------------------------------------*/
         xx_emf.call_store_message (p_message_group       => 'ALL',
                                    p_header_id           => l_header_id,
                                    p_debug_value         => 20,          --Low level debugging
                                    p_global_debug        => g_debug_level,
                                    p_identifier1         => 'Flushing Data into EMF',
                                    p_process_status      => l_return_value,
                                    p_error_message       => l_output_message
                                   );

         IF l_return_value = 1
         THEN
            l_return_value := NULL;
            xx_trace.h ('Unable to call EMF error log');
            l_return_value :=
                         xx_emf.update_program_status (l_header_id, l_status);
         END IF;

         l_return_value := NULL;
/*----------------------------------------------------------------------------
Purpose: Call to set EMF error and report section column widths
--------------------------------------------------------------------------*/
         l_err_width_rec.identifier1 := TO_CHAR (g_err_col1_width);
         l_err_width_rec.identifier2 := TO_CHAR (g_err_col2_width);
         l_err_width_rec.identifier3 := TO_CHAR (g_err_col3_width);
         l_err_width_rec.identifier4 := TO_CHAR (g_err_col4_width);
         l_err_width_rec.identifier5 := TO_CHAR (g_err_col5_width);
         l_err_width_rec.identifier6 := TO_CHAR (g_err_col6_width);
         l_err_width_rec.identifier7 := TO_CHAR (g_err_col7_width);
         l_err_width_rec.identifier8 := TO_CHAR (g_err_col8_width);
/*----------------------------------------------------------------
Purpose--Call to generate output file (Errors/Messages)
--------------------------------------------------------------*/
         l_err_width_rec.header_id := l_header_id;
         l_return_value :=
            xx_emf.display_output_messages (p_header_id          => l_header_id,
                                            p_err_width_rec      => l_err_width_rec
                                           );

         IF l_return_value = 1
         THEN
            xx_trace.h ('Unable to display output messages');
         END IF;

         l_return_value := NULL;
/*-------------------------------------------------------------------
  Call update program status
---------------------------------------------------------------------*/
         l_status := 'ERROR';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         IF l_return_value = 1
         THEN
            xx_trace.h ('Unable to update program status');
            l_return_value := NULL;
         END IF;
   END main;

/*******************************************************************************
* Procedure Name :   XX_COMMON_VALIDATION_PRC
* Purpose        :   This program will validate data
*               to be inserted Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_COMMON_VALIDATION_PRC (
      p_organization_code   IN OUT   xx_cst_item_dtls_preint.organization_code%TYPE,
      p_cost_type           IN OUT   xx_cst_item_dtls_preint.cost_type%TYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_organization_id     NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                            := 0;
      l_interface_stg_rec   xx_cst_item_dtls_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_cost_type_id        NUMBER;
   --
   --
   BEGIN
      --
      p_error_flag := 'N';
      --Validation of organization Code
      BEGIN
         l_value := NULL;
        BEGIN
            SELECT  organization_id
              INTO  l_organization_id
              FROM  mtl_parameters
             WHERE  organization_code = p_organization_code;
         EXCEPTION
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception occured while retrieving organization id for given organization code.Oracle Error-'
                   || SQLERRM
                  );
         END;
--
         XX_COMMON_VALIDATIONS_PKG.VALIDATE_ORGANIZATION
                                  (p_organization_name      => l_value,
                                   p_organization_code      => p_organization_code,
                                   p_organization_id        => l_organization_id,
                                   p_process_status         => l_process_status,
                                   p_error_message          => l_output_message
                                  );
IF l_process_status = 1
         THEN
   p_error_flag := 'Y';
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Error in Validating Organization Code'
                                         || l_output_message,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,          -- Can be utilized for displaying more information
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         --
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   ' Exception occured while validating for organization.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception occured while validating for organization.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,         -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,          -- Can be utilized for displaying more information
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
      --Vilidation Of Cost type
      BEGIN
         --
         SELECT a.cost_type_id
           INTO l_cost_type_id
           FROM cst_cost_types a
          WHERE a.cost_type = p_cost_type;
      --
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                      ('Cost type does not exist for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Cost type does not exist for the Organization given',
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
                p_identifier6         => NULL,           -- Can be utilized for displaying more information
                p_identifier7         => NULL,           -- Can be utilized for displaying more information
p_identifier8         => NULL,           -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Validating Cost Type.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Cost Type.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,             -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,               -- Can be utilized for displaying more information
                p_identifier7         => NULL,               -- Can be utilized for displaying more information
                p_identifier8         => NULL,               -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in Organization Code and Cost Type Validation Procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_COMMON_VALIDATION_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_ITM_COST_PRC
* Purpose        :   This program will validate data
*               to be inserted into the Cost Details tables..
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_ITM_COST_PRC (
      p_details_preint_rec   IN OUT   xx_cst_item_dtls_preint%ROWTYPE,
      p_header_id            IN       NUMBER,
      p_error_flag           OUT      VARCHAR2
   )
   IS
      l_inventory_item_id   NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                            := 0;
      l_interface_stg_rec   xx_cst_item_dtls_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_cost_element_id     NUMBER;
   BEGIN
      --1 Begin
      --p_error_flag := 'N';

      --
      -- Validation of Item Number
      BEGIN

         SELECT   inventory_item_id
           INTO   l_inventory_item_id
           FROM   mtl_system_items_b    msi
 ,org_organization_definitions   ood
          WHERE   msi.organization_id   = ood.organization_id
   AND   msi.segment1          = p_details_preint_rec.item_number
            AND   ood.organization_code = p_details_preint_rec.organization_code;
      --
      EXCEPTION
         --
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Item Does Not Exist For the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Item Does Not Exist for the Organization given',
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Item Segment .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Item Segment .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

      -- Validating Cost Element
      BEGIN
         --
         SELECT DISTINCT   a.cost_element_id
                    INTO   l_cost_element_id
                    FROM   cst_cost_elements a,
                           cst_item_cost_details b,
                           org_organization_definitions od
                   WHERE   a.cost_element_id    = b.cost_element_id
                     AND   od.organization_id   = b.organization_id
                     AND   od.organization_code = p_details_preint_rec.organization_code
                     AND   a.cost_element       = 'Material'
                     AND   a.cost_element       = p_details_preint_rec.cost_element;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            --
            p_error_flag := 'Y';
            xx_trace.l ('Cost Element is not valid for Item Cost Import.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Cost Element is not valid for Item Cost Import',
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Cost Element Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Cost Element.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate cost procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_ITM_COST_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_COST_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Resource Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_RSC_COST_PRC (
      p_cost_resource_rec   IN OUT   xx_cst_resource_costs_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_resource_id                NUMBER;
      l_functional_currency_flag   NUMBER;
      l_return_value               NUMBER;
      l_output_message             VARCHAR2 (1000);
      l_process_status             NUMBER                                := 0;
      l_interface_stg_rec          xx_cst_resource_costs_preint%ROWTYPE;
      l_value                      VARCHAR2 (50);
   BEGIN
      --1 Begin
      --p_error_flag := 'N';
      --
      --
      --
      -- Validation of Resource Code
      BEGIN
       --
       SELECT  resource_id,functional_currency_flag  
         INTO  l_resource_id,l_functional_currency_flag          
         FROM  bom_resources br                
               ,org_organization_definitions ood
        WHERE  br.organization_id = ood.organization_id
          AND  organization_code  = p_cost_resource_rec.organization_code          
          AND  resource_code      = p_cost_resource_rec.resource_code;      
       --
       IF l_functional_currency_flag = 1
       THEN                        
         IF p_cost_resource_rec.resource_rate IS NOT NULL
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Resource rate should be NULL for Functional Currency Flag set to 1.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,              -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource rate should be NULL for Functional Currency Flag set to 1.',
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,           -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         END IF;
        END IF;
      --
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                  ('Resource Code does not exists for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource Code does not exist for the Organization given.',
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,            -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Resource Code  .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Resource Code .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,            -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Resource Cost procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_RSC_COST_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_OHD_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Resource Overhead Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_RSC_OHD_PRC (
      p_resc_overhead_rec   IN OUT   xx_cst_res_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_resource_id         NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                                := 0;
      l_interface_stg_rec   xx_cst_res_overheads_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_overhead_id         NUMBER;
   BEGIN
      --p_error_flag := 'N';

      -- Validation of Resource Code
      BEGIN
         SELECT   resource_id
           INTO   l_resource_id
           FROM   bom_resources br
 ,org_organization_definitions  ood
          WHERE   ood.organization_id   = br.organization_id
   AND   br.resource_code      = p_resc_overhead_rec.resource_code
            AND   ood.organization_code = p_resc_overhead_rec.organization_code;
      --
      EXCEPTION
         --
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                  ('Resource Code does not exist for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource Code does not exist for the Organization given',
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Resource Code  .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Resource Code .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      --
      END;

      -- Validating Resource Overhead
      BEGIN
         --
    SELECT    bomr.resource_id
      INTO    l_overhead_id
               FROM    bom_resources bomr
                       ,org_organization_definitions ood
              WHERE    ood.organization_id   =  bomr.organization_id
                AND    ood.organization_code =  p_resc_overhead_rec.organization_code
                AND    bomr.resource_code    =  p_resc_overhead_rec.overhead
                AND    bomr.cost_element_id in (2,5);
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Overhead does not exist for the organization and cannot be assigned to a resource.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,                -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Overhead does not exist for the organization and cannot be assigned to a resource.',
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,             -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,             -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Rescource Overhead Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Rescource Overhead.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Resource Overhead procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_RSC_OHD_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_DEPT_OHD_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Department Overhead Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_DEPT_OHD_PRC (
      p_dept_overhead_rec   IN OUT   xx_cst_dept_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_department_id       NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                                 := 0;
      l_interface_stg_rec   xx_cst_dept_overheads_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_overhead_id         NUMBER;
   BEGIN
      --p_error_flag := 'N';
      -- Validation of Department Code
      IF (p_dept_overhead_rec.department_code IS NOT NULL)
      THEN
         BEGIN
            --
            SELECT   bd.department_id
              INTO   l_department_id
              FROM   bom_departments bd
            ,org_organization_definitions ood
             WHERE   ood.organization_id   = bd.organization_id
      AND   bd.department_code    = p_dept_overhead_rec.department_code
               AND   ood.organization_code = p_dept_overhead_rec.organization_code;
         EXCEPTION
            --
            WHEN NO_DATA_FOUND
            THEN
               p_error_flag := 'Y';
               xx_trace.l
                     ('Department does not exist for the Organization given.');
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,         -- low level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         => 'Department does not exists for the Organization given',
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
               NULL;
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   'Exception Occured While Validating Department Code .Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         =>    'Exception Occured While Validating Department Code .Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;

      -- Validating Department Overhead
      IF (p_dept_overhead_rec.overhead IS NOT NULL)
      THEN
         BEGIN
            --
             SELECT    bomr.resource_id
      INTO    l_overhead_id
               FROM    bom_resources bomr
                       ,org_organization_definitions ood
              WHERE    ood.organization_id   =  bomr.organization_id
                AND    ood.organization_code =  p_dept_overhead_rec.organization_code
                AND    bomr.resource_code    =  p_dept_overhead_rec.overhead
                AND    bomr.cost_element_id  =  5 ;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               p_error_flag := 'Y';
               xx_trace.l ('Overhead does not exist for the organization and cannot be assigned to a department.');
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,         -- low level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         => 'Overhead does not exist for the organization and cannot be assigned to a department',
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   'Exception Ocurred While Department Overhead Validation.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         =>    'Exception Ocurred While Validating Department Overhead.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Department Overhead procedure.
       Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_DEPT_OHD_PRC;
END XX_INVCNV02_COST_UPLOAD_PKG;
/
CREATE OR REPLACE PACKAGE BODY XX_INVCNV02_COST_UPLOAD_PKG
AS
/********************************************************************************************
Package Name    :   XX_INVCNV02_COST_UPLOAD_PKG
Author's Name   :   Madhu Dhare
Date Written    :   18-Dec-2006
RICEW Object id :   INV_CNV_02
Purpose         :   Package Body
Program Style   :
--
Maintenance History:
Version       Date:             Name                 Remarks
-----------   -------------    ------------------   ---------------
 1.0          18-Dec-06      Madhu Dhare   Initial Version
***************************************************************************************************/
--
/*******************************************************************************
* Procedure Name :   XX_COMMON_VALIDATION_PRC
* Purpose        :   This program will validate organization code and cost type 
*                    for the Cost Upload
*
*******************************************************************************/
   PROCEDURE XX_COMMON_VALIDATION_PRC(
      p_organization_code   IN OUT   xx_cst_item_dtls_preint.organization_code%TYPE,
      p_cost_type           IN OUT   xx_cst_item_dtls_preint.cost_type%TYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_ITM_COST_PRC
* Purpose        :   This program will validate item cost 
*                    for the Cost Upload in Item details table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_ITM_COST_PRC(
      p_details_preint_rec   IN OUT   xx_cst_item_dtls_preint%ROWTYPE,
      p_header_id            IN       NUMBER,
      p_error_flag           OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_COST_PRC 
* Purpose        :   This program will validate resource cost 
*                    for the Cost Upload in Resource Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_RSC_COST_PRC (
      p_cost_resource_rec   IN OUT   xx_cst_resource_costs_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_OHD_PRC 
* Purpose        :   This program will validate resource overhead cost 
*                    for the Cost Upload in Resource Overhead Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_RSC_OHD_PRC (
      p_resc_overhead_rec   IN OUT   xx_cst_res_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************
* Procedure Name :   XX_VALIDATE_DEPT_OHD_PRC 
* Purpose        :   This program will validate department overhead cost 
*                    for the Cost Upload in Department Overhead Cost table.
*
*******************************************************************************/

   PROCEDURE XX_VALIDATE_DEPT_OHD_PRC (
      p_dept_overhead_rec   IN OUT   xx_cst_dept_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   );
--
/*******************************************************************************************************
Procedure Name : MAIN
Purpose        : This program will read the records from the staging tables
                 for  Cost upload in Item,Resource and overhead tables.Perform
control and business level validations .
        It will load the data into the interface tables and call the
        Oracle Import Program to Upload Cost.
*******************************************************************************************************/

   PROCEDURE MAIN (
      p_errbuf       OUT      VARCHAR2,
      p_retcode      OUT      VARCHAR2,
      p_run_option   IN       VARCHAR2,
      p_run_mode     IN       VARCHAR2,
      p_cost_type    IN       VARCHAR2
   )
   IS
--Cursor to select cost data based on run option from staging table
   CURSOR c_cst_details (p_rec_type VARCHAR2)
      IS
         SELECT     *
               FROM XX_CST_ITEM_UPLOAD_STG
              WHERE status = 'NW'
AND record_type != 'CNT'
                AND record_type =
                       DECODE (p_rec_type,
                               'ITM', 'ITM',
                               'RSC', 'RSC',
                               'OHD', 'OHD',
                               record_type
                              );
         --FOR UPDATE;

--CURSOR TO INSERT ITEM DATA INTO INTERFACE TABLE
--
--Cursor to insert in Cost Details Interface Table
      CURSOR c_details_preint
      IS
         SELECT *
           FROM XX_CST_ITEM_DTLS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Resource Cost Interface Table
      CURSOR c_cost_resource
      IS
         SELECT *
           FROM XX_CST_RESOURCE_COSTS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Resource Overheads Interface Table
      CURSOR c_resc_overhead
      IS
         SELECT *
           FROM XX_CST_RES_OVERHEADS_PREINT
          WHERE status = 'IP';

--Cursor to insert in Department Overheads Interface Table
      CURSOR c_dept_overhead
      IS
         SELECT *
           FROM XX_CST_DEPT_OVERHEADS_PREINT
          WHERE status = 'IP';

/*--------------------------------------------------------------------------------------------------------
Private Variable Declaration Section
---------------------------------------------------------------------------------------------------------*/
--General Variables
      l_seq_val1                      NUMBER;
      l_seq_val2                      NUMBER;
      l_seq_val3                      NUMBER;
      l_seq_val4                      NUMBER;
      l_standard_request_id           fnd_concurrent_requests.request_id%TYPE  := 0;
      l_completed                     BOOLEAN;
      l_process_status                NUMBER;
      l_interface_stg_rec             xx_cst_item_dtls_preint%ROWTYPE;
      l_organization_id               NUMBER;
      l_count                         NUMBER                                   :=0 ;
      l_user_id                       fnd_concurrent_requests.requested_by%TYPE;
      l_inventory_item_id             NUMBER;
      l_resource_id                   NUMBER;
      l_department_id                 NUMBER;
      l_run_option                    VARCHAR2 (3);
--
--EMF Variables
      l_package_name                  xx_emf_message_headers.program_name%TYPE   := 'XX_INVCNV02_COST_UPLOAD_PKG';
      l_program_name                  xx_emf_message_headers.program_name%TYPE   := l_package_name || '.' || 'MAIN';
      l_ricewid                       xx_emf_message_headers.ricew_id%TYPE       := 'INV_CNV_02';       --Object Name
      l_request_id                    xx_emf_message_headers.request_id%TYPE;
      l_error_rec                     xx_emf_message_details%ROWTYPE;                     --used for EMF error header
      l_messages_rec                  xx_emf_message_details%ROWTYPE;                     --used for EMF messages
      l_null_rec                      xx_emf_message_details%ROWTYPE             := NULL; --used for EMF messages
      l_header_id                     xx_emf_message_headers.header_id%TYPE;              --EMF ID
      l_return_value                  NUMBER                                     := NULL; --stores number returned by EMF API's
      l_err_width_rec                 xx_emf.output_rec_type;
      l_data_count                    NUMBER;                       --record type variable for assigning width to error section
      l_processed_recs_itm            NUMBER          := 0; --stores total records for summary report of Item Cost Interface
      l_successful_recs_itm           NUMBER          := 0; --stores total successful records for summary report of Item Cost Interface
      l_error_recs_itm                NUMBER          := 0; --stores total error records for the summary report of Item Cost Interface
      l_processed_recs_rsc            NUMBER          := 0; --stores total records for summary report of Resource Cost Interface
      l_successful_recs_rsc           NUMBER          := 0; --stores total successful records for summary report of Resource Cost Interfaace
      l_error_recs_rsc                NUMBER          := 0; --stores total error records for the summary report of Resource Cost Interface
      l_processed_recs_rohd           NUMBER          := 0; --stores total records for summary report of Resource Overhead Cost Interface
      l_successful_recs_rohd          NUMBER          := 0; --stores total successful records for summary report of Resource Overhead Cost Interface
      l_error_recs_rohd               NUMBER          := 0; --stores total error records for the Resource Overhead summary report
      l_processed_recs_dohd           NUMBER          := 0; --stores total records for summary report of Department Overhead Cost Interface
      l_successful_recs_dohd          NUMBER          := 0; --stores total successful records for summary report of Department Overhead Cost Interface
      l_error_recs_dohd               NUMBER          := 0; --stores total error records for the Department Overhead Cost summary report
      l_status                        xx_emf_message_headers.status%TYPE;  --stores ERROR/WARNING/SUCCESS
      l_error_flag                    VARCHAR2 (1)    := 'N';              --Flag to capture error (Y=ERROR/N=SUCCESS)
      l_warning_flag                  VARCHAR2 (1);                        --Flag to capture warning ('W')
      l_output_message                VARCHAR2 (1000);                     --stores the message returned from external routines
      l_phase                         VARCHAR2 (200);
      l_vstatus                       VARCHAR2 (200);
      l_dev_phase                     VARCHAR2 (200);
      l_dev_status                    VARCHAR2 (200);
      l_message                       VARCHAR2 (2000);
    --
--  Common Validations Variables
--  Exception Variables
      e_emf_initialize_error          EXCEPTION;                          --Stop the program if EMF initialization fails
      e_emf_initialize_detail_error   EXCEPTION;                          --Stop the program with EMF error header insertion fails
      e_cntrl_fail                    EXCEPTION;
   BEGIN
      l_request_id := fnd_profile.VALUE ('CONC_REQUEST_ID');
      l_user_id    := fnd_profile.VALUE ('USER_ID');
/*----------------------------------------------------------------------------------------------------
Initialize Trace
Purpose : Set the program environment for Tracing
-----------------------------------------------------------------------------------------------------*/
      xx_trace.set_program_environment (p_program_name => l_program_name);
/*----------------------------------------------------------------------------------------------------
Initialize EMF Section
Purpose : EMF is initialized so that error can be logged.
-----------------------------------------------------------------------------------------------------*/
      xx_trace.vl ('Entering Program ' || l_program_name);
      --Call to EMF insert_program_start
      l_header_id :=
         xx_emf.insert_program_start (p_program_name      => l_program_name,
                                      p_program_type      => g_program_type,
                                      p_ricew_id          => l_ricewid,
                                      p_request_id        => l_request_id
                                     );

      IF (l_header_id <= 1)
      THEN                                --Header id should be greater than 1
         RAISE e_emf_initialize_error;
      --Raise Exception to Stop the program if EMF initialization fails
      END IF;
      --
      --
      xx_trace.l ('EMF initialized, header_id :' || TO_CHAR (l_header_id));
      --
/*----------------------------------------------------------------------------------------------------
Insert EMF Header
Purpose : To tag the Error labels to EMF columns
-----------------------------------------------------------------------------------------------------*/
      l_error_rec.header_id := l_header_id;
      --
      -- Identifier to locate an error.
      --
      l_error_rec.identifier1 := 'Error Code';            --First Error Header
      l_error_rec.identifier2 := 'Error Message';         --Second Error Header
      l_error_rec.identifier3 := 'Record ID';             --Third Error Header
      l_error_rec.identifier4 := 'Organization Code';     --Fourth Error Header
      l_error_rec.identifier5 := 'Cost Type';             --Fifth Error Header
      l_error_rec.identifier6 := 'Item Number';           --Sixth Error Header
      l_error_rec.identifier7 := 'Resource Code';         --Seventh Error Header
      l_error_rec.identifier8 := 'Department Code';       --Eighth Error Header
      --
      -- Insert error header
      --
      l_return_value :=  xx_emf.insert_error_headers (p_error_rec => l_error_rec);
      --
      IF l_return_value = 1
      THEN                       --(1 indicates Error and 0 indicates Success)
                                 --Raise Exception to Stop the program with 'ERROR' status if EMF error header initilaization fails
         RAISE e_emf_initialize_detail_error;
      END IF;
      --
      xx_trace.l ('EMF Error Header inserted');
      l_return_value := NULL;
   --
/*---------------------------------------------------------------------------------------------------
Call To Purge  Program  xx_emf.purge_ricewid_dated_messages
Purpose : DELETE EMF error records for this  RICE object based on retention period.
----------------------------------------------------------------------------------------------------*/
      l_return_value :=
         xx_emf.purge_ricewid_dated_messages (l_ricewid,
                                              (SYSDATE - g_retention_period
                                              )
                                             );
      --
      IF l_return_value = 1
      THEN
         --
         l_warning_flag := 'W';
         xx_trace.l ('Failed to purge old EMF records');
      --
      END IF;

/*---------------------------------------------------------------------------------------------------
Read Staging Table Data and Perform Control Level Validations
---------------------------------------------------------------------------------------------------*/
--Run mode will decide if the conversion will be run in full run mode 'F' or Partial run mode 'P'.
--IF p_run_mode is 'F the coversion starts with control validation for records with Status 'NW'in staging table
--IF p_run_mode is 'P' the coversion starts with business validation for records with Status 'IP''
--in the pre-interface table. The errored out records of previous run can be fixed in the pre-interface table
--if required and then this program can be run in partial mode .

      IF p_run_mode = 'F'
      THEN             -- --Checking for record count mis-match
   BEGIN
 SELECT COUNT(*)
 INTO l_data_count
 FROM xx_cst_item_upload_stg
 WHERE record_type != 'CNT';
 --
 SELECT DECODE(rec_count,l_data_count,0,1)
 INTO l_data_count
 FROM xx_cst_item_upload_stg
 WHERE record_type = 'CNT';
 --
    IF l_data_count !=0
    THEN
xx_trace.l ('The received data file is not a complete data file.Exiting the program');                                 
     --Write to Error                                                            
    xx_emf.call_store_message                                                   
     (p_message_group      => 'ERR_DTL'                                        
    , p_header_id          => l_header_id                                      
    , p_debug_value        => 20                 -- low level debugging        
    , p_global_debug       => g_debug_level                                    
    , p_identifier1        => 'E-00001'                                        
    , p_identifier2        => 'The received data file is not a complete data file.Exiting the program'
    , p_identifier3        => NULL
    , p_identifier4        => NULL
    , p_identifier5        => NULL                                             
    , p_identifier6        => NULL                                             
    , p_identifier7        => NULL                                             
    --p_identifier8        => NULL               -- Can be utilized for displaying more information 
    , p_process_status     => l_return_value                                   
    , p_error_message      => l_output_message                                 
     );
    UPDATE XX_CST_ITEM_UPLOAD_STG
    SET    status='ER';
 
    END IF;
  EXCEPTION
   WHEN OTHERS THEN
 xx_trace.l ('Exception while verifying the record count in the data file.  Exiting the program'
            ||SQLERRM);                                 
   --Write to Error                                                            
   xx_emf.call_store_message                                                   
     (p_message_group      => 'ERR_DTL'                                        
    , p_header_id          => l_header_id                                      
    , p_debug_value        => 20                 -- low level debugging        
    , p_global_debug       => g_debug_level                                    
    , p_identifier1        => 'E-00001'                                        
    , p_identifier2        => 'Exception while verifying the record count in the data file.  Exiting the program'
                          ||SQLERRM                    
    , p_identifier3        => NULL
    , p_identifier4        => NULL
    , p_identifier5        => NULL                                             
    , p_identifier6        => NULL                                             
    , p_identifier7        => NULL                                             
    --p_identifier8        => NULL              -- Can be utilized for displaying more information 
    , p_process_status     => l_return_value                                   
    , p_error_message      => l_output_message                                 
     );
    UPDATE XX_CST_ITEM_UPLOAD_STG
    SET    status='ER';
 
  END; 
     
        /*************               CONTROL LEVEL VALIDATIONS     *******************/
BEGIN
         FOR c_cst_details_rec IN c_cst_details (p_run_option)
         LOOP
   l_error_flag :='N';
            IF    c_cst_details_rec.record_type = p_run_option OR p_run_option = 'ALL'
            THEN
               --  Validate unconditionally if Organization Code is null
               IF c_cst_details_rec.organization_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Organization Code value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,       -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Organization Code value cannot be null',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               --  Validate unconditionally if Cost Type is null
               IF c_cst_details_rec.cost_type IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Type value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Type value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;                                                       --

               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                     WHERE  record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END IF;
         END LOOP;
--
-- Control validations for Item Cost
         IF p_run_option = 'ITM' OR p_run_option = 'ALL'
         THEN
            --   Validations specific for 'ITM' Cost Load
            FOR c_cst_details_rec IN c_cst_details ('ITM')
            LOOP
               --   Validate if Item Number is null
               IF c_cst_details_rec.item_number IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Item Segment value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Item Segment value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

               --
               -- Validate if Cost Element is null
               IF c_cst_details_rec.cost_element IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
      --
               --   Validate if Usage Rate or Amount is null
               IF c_cst_details_rec.usage_rate_or_amount IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Usage rate or amount value cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Usage rate or amount value cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                      WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table Status. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
         --
-- Validations specific for 'RSC' Cost Load
         IF p_run_option = 'RSC' OR p_run_option = 'ALL'
         THEN
           FOR c_cst_details_rec IN c_cst_details ('RSC')
            LOOP
               IF c_cst_details_rec.resource_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Resource Code cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Code cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;

               --
               IF c_cst_details_rec.resource_rate IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Resource Rate cannot be null.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,       -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Rate cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
  
      IF c_cst_details_rec.cost_element IS NOT NULL AND c_cst_details_rec.cost_element != 'Resource'
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value for record type RSC must be Resource.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value for record type RSC must be Resource.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE  xx_cst_item_upload_stg
                        SET  status = 'ER'
                       WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
--
         -- Control Validation for Overhead Cost
         IF p_run_option = 'OHD' OR p_run_option = 'ALL'
         THEN
            FOR c_cst_details_rec IN c_cst_details ('OHD')
            LOOP
               IF  c_cst_details_rec.resource_code IS NULL  AND c_cst_details_rec.department_code IS NULL
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('Resource Code and Department Code both cannot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Resource Code and Department Code both cannot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
  
      IF  c_cst_details_rec.resource_code IS NOT NULL  AND c_cst_details_rec.overhead_code IS NULL 
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('For record type OHD if resource code exists then overhead code cannnot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'For record type OHD if resource code exists then overhead code cannnot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
  
      IF  c_cst_details_rec.department_code IS NOT NULL  AND c_cst_details_rec.overhead_code IS NULL 
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l
                     ('For record type OHD if department code exists then overhead code cannnot be null.'
                     );
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,      -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'For record type OHD if department code exists then overhead code cannnot be null.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.resource_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
  
      IF c_cst_details_rec.cost_element IS NOT NULL AND c_cst_details_rec.cost_element != 'Overhead'
               THEN
                  l_error_flag := 'Y';
                  xx_trace.l ('Cost Element value for record type OHD must be Overhead.');
                  --Write to Error
                  xx_emf.call_store_message
                     (p_message_group       => 'ERR_DTL',
                      p_header_id           => l_header_id,
                      p_debug_value         => 20,        -- low level debugging
                      p_global_debug        => g_debug_level,
                      p_identifier1         => 'E-00001',
                      p_identifier2         => 'Cost Element value for record type OHD must be Overhead.',
                      p_identifier3         => c_cst_details_rec.record_id,
                      p_identifier4         => c_cst_details_rec.organization_code,
                      p_identifier5         => c_cst_details_rec.cost_type,
                      p_identifier6         => c_cst_details_rec.item_number,
                      p_identifier7         => c_cst_details_rec.department_code,
                      p_identifier8         => c_cst_details_rec.department_code,
                      p_process_status      => l_return_value,
                      p_error_message       => l_output_message
                     );
               END IF;
               --
               IF l_error_flag = 'Y'
               THEN
                  BEGIN
                     UPDATE xx_cst_item_upload_stg
                        SET status = 'ER'
                      WHERE record_id = c_cst_details_rec.record_id;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.l
                           (   'Exception While Updating Staging Table. Oracle Error :'
                            || SQLERRM
                           );
                  END;
               END IF;
            END LOOP;
         END IF;
      COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h (   'Exception in Control Validation. Oracle Error :'
                        || SQLERRM
                       );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 40,           -- high level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00001',
                p_identifier2         =>    'Error in Control Validation.'
                                         || SQLERRM,
                p_identifier3         => NULL,         -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

--END of Control Level Validation
/*---------------------------------------------------------------------------------------------------
LOAD DATA INTO PRE-INTERFACE TABLE
---------------------------------------------------------------------------------------------------*/
      BEGIN
         FOR c_cst_details_rec1 IN c_cst_details (p_run_option)
         LOOP
            IF p_run_option = 'ITM' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'ITM')
            THEN
   --
    SELECT XX_CST_ITEM_DTLS_PREINT_S.NEXTVAL
             INTO   l_seq_val1
             FROM   DUAL;
             INSERT INTO XX_CST_ITEM_DTLS_PREINT
                           (status,
   record_id,
   process_flag,
   item_number,
                            organization_code,
                            usage_rate_or_amount,
                            item_cost,
                            cost_type,
                            cost_element,
                            resource_rate,
                            resource_code,
                            department,
                            request_id, 
           last_update_date,
           last_updated_by,
                            creation_date,
           created_by,
   last_update_login
                           )
                    VALUES ('IP',
           l_seq_val1,
           1,  --Process Flag has to be set to 1 for processing
                            c_cst_details_rec1.item_number,
                            c_cst_details_rec1.organization_code,
                            c_cst_details_rec1.usage_rate_or_amount,
                            c_cst_details_rec1.item_cost,
                            c_cst_details_rec1.cost_type,
                            c_cst_details_rec1.cost_element,
                            c_cst_details_rec1.resource_rate,
                            c_cst_details_rec1.resource_code,
                            c_cst_details_rec1.department_code,
                            l_request_id,
           SYSDATE,
           l_user_id,
                            SYSDATE,
           l_user_id,
   l_user_id
                           );
             END IF;

            IF p_run_option = 'RSC' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'RSC')
            THEN
   --
     SELECT XX_CST_RESOURCE_COSTS_PREINT_S.NEXTVAL
              INTO   l_seq_val2
              FROM   DUAL;
              INSERT INTO XX_CST_RESOURCE_COSTS_PREINT
                           (status,
   record_id,
           process_flag, 
           resource_code,
                            cost_type,
                            organization_code,
                            resource_rate,
                            request_id,
           last_update_date, 
           last_updated_by,
                            creation_date, 
           created_by,
   last_update_login
                           )
                    VALUES ('IP',
           l_seq_val2,
           1,   --Process Flag has to be set to 1 for processing
                            c_cst_details_rec1.resource_code,
                            c_cst_details_rec1.cost_type,
                            c_cst_details_rec1.organization_code,
                            c_cst_details_rec1.resource_rate,
                            l_request_id, SYSDATE, l_user_id,
                            SYSDATE, l_user_id,l_user_id
                           );
            END IF;

            IF    p_run_option = 'OHD' OR (p_run_option = 'ALL' AND c_cst_details_rec1.record_type = 'OHD')
            THEN
               IF  c_cst_details_rec1.resource_code IS NOT NULL AND c_cst_details_rec1.overhead_code IS NOT NULL
               THEN
      --
        SELECT XX_CST_RES_OVERHEADS_PREINT_S.NEXTVAL
                 INTO   l_seq_val3
                 FROM   DUAL;
                 INSERT INTO XX_CST_RES_OVERHEADS_PREINT
                              (status, 
      record_id,
              process_flag, 
              resource_code,
                               cost_type,
                               organization_code,
                               overhead,
                               request_id, 
              last_update_date,
                               last_updated_by, 
              creation_date, 
              created_by,
      last_update_login
                              )
                       VALUES('IP',
              l_seq_val3,
              1,    --Process Flag has to be set to 1 for processing
                               c_cst_details_rec1.resource_code,
                               c_cst_details_rec1.cost_type,
                               c_cst_details_rec1.organization_code,
                               c_cst_details_rec1.overhead_code,
                               l_request_id, 
      SYSDATE,
                               l_user_id, 
      SYSDATE, 
      l_user_id,
      l_user_id
                              );
               END IF;

               IF c_cst_details_rec1.department_code IS NOT NULL
               THEN
      --
        SELECT XX_CST_DEPT_OVERHEADS_PREINT_S.NEXTVAL
                 INTO   l_seq_val4
                 FROM   DUAL;
                 INSERT INTO XX_CST_DEPT_OVERHEADS_PREINT
                              (status, 
      record_id,
      process_flag, 
      department_code,
                               cost_type,
                               organization_code,
                               overhead,
                               rate_or_amount,
                               request_id, 
      last_update_date,
                               last_updated_by, 
      creation_date, 
      created_by,
      last_update_login
                              )
                       VALUES ('IP',
              l_seq_val4,
              1,  --Process Flag has to be set to 1 for processing
                               c_cst_details_rec1.department_code,
                               c_cst_details_rec1.cost_type,
                               c_cst_details_rec1.organization_code,
                               c_cst_details_rec1.overhead_code,
                               c_cst_details_rec1.rate_or_amount,
                               l_request_id, 
      SYSDATE,
                               l_user_id, 
      SYSDATE, 
      l_user_id,
      l_user_id
                              );
               END IF;
            END IF;
         END LOOP;
         --
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Exception While Inserting Into Pre-Interface table. Oracle Error:'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00002',
                p_identifier2         =>    'Exception While Inserting Into Pre-Interface table.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
      END IF; --p_run_mode = 'F'

/*----------------------------------------------------------------------------
***********         BUSINESS VALIDATIONS      ********************
----------------------------------------------------------------------------*/
      BEGIN
            IF  p_run_option = 'ITM' OR  p_run_option = 'ALL' 
            THEN
               FOR c_details_preint_rec IN c_details_preint
               LOOP
                  l_processed_recs_itm := l_processed_recs_itm + 1;   --Counter for total records
                  --
 --Call to procedure for  Item validation  
                  XX_COMMON_VALIDATION_PRC
                                     (c_details_preint_rec.organization_code,
                                      c_details_preint_rec.cost_type,
                                      l_header_id,
                                      l_error_flag
                                     );
                  XX_VALIDATE_ITM_COST_PRC (c_details_preint_rec,
                                            l_header_id,
                                            l_error_flag
                                           );
                  -- Updating pre interface table with status 'ER' where record_status in('NW','PF')
                  -- Update Item Cost Pre-Interface Table
                  IF l_error_flag = 'Y'
                  THEN
                     BEGIN
                        --Update Details Pre-Interface
                        UPDATE XX_CST_ITEM_DTLS_PREINT
                           SET status = 'ER'
                         WHERE item_number       = c_details_preint_rec.item_number
                           AND organization_code = c_details_preint_rec.organization_code
  AND record_id         = c_details_preint_rec.record_id;
    --
    EXCEPTION  
                        WHEN OTHERS
                        THEN
                           l_error_flag := 'Y';
                           xx_trace.h
                              (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                               || SQLERRM
                              );
                           xx_emf.call_store_message
                              (p_message_group       => 'ERR_DTL',
                               p_header_id           => l_header_id,
                               p_debug_value         => 40,     -- High level debugging
                               p_global_debug        => g_debug_level,
                               p_identifier1         => 'E-12300',
                               p_identifier2         => 'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                        || SQLERRM,
                               p_identifier3         => c_details_preint_rec.record_id,
                               p_identifier4         => c_details_preint_rec.organization_code,
                               p_identifier5         => c_details_preint_rec.cost_type,
                               p_identifier6         => c_details_preint_rec.item_number,
                              -- p_identifier7       => c_details_preint_rec.resource_code,
                              -- p_identifier8       => c_details_preint_rec.department_code,
                               p_process_status      => l_return_value,
                               p_error_message       => l_output_message
                              );
                     END;
                  ELSE
                     l_successful_recs_itm := l_successful_recs_itm + 1;
                  END IF;
                     l_error_flag := 'N';
               END LOOP;
            END IF;
            --
            -- Businesss Validation for Resource Cost Table
            IF  p_run_option = 'RSC'  OR  p_run_option = 'ALL' 
            THEN
               FOR c_cost_resource_rec IN c_cost_resource
               LOOP
                  l_processed_recs_rsc := l_processed_recs_rsc + 1; --Counter for total records
                  -- Call to procedure for validation
                  XX_COMMON_VALIDATION_PRC
                                      (c_cost_resource_rec.organization_code,
                                       c_cost_resource_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                  XX_VALIDATE_RSC_COST_PRC (c_cost_resource_rec,
                                            l_header_id,
                                            l_error_flag
                                           );
                  IF l_error_flag = 'Y'
                  THEN
                     BEGIN
                        --Update Resource Cost Pre-Interface Table
                        UPDATE XX_CST_RESOURCE_COSTS_PREINT
                           SET status = 'ER'
                         WHERE resource_rate     = c_cost_resource_rec.resource_rate
                           AND organization_code = c_cost_resource_rec.organization_code
  AND record_id         = c_cost_resource_rec.record_id;
                     EXCEPTION
                        WHEN OTHERS
                        THEN
                           l_error_flag := 'Y';
                           xx_trace.h
                              (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                               || SQLERRM
                              );
                           xx_emf.call_store_message
                              (p_message_group       => 'ERR_DTL',
                               p_header_id           => l_header_id,
                               p_debug_value         => 40,   -- High level debugging
                               p_global_debug        => g_debug_level,
                               p_identifier1         => 'E-12300',
                               p_identifier2         =>    'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                        || SQLERRM,
                               p_identifier3         => c_cost_resource_rec.record_id,
                               p_identifier4         => c_cost_resource_rec.organization_code,
                               p_identifier5         => c_cost_resource_rec.cost_type,
                              -- p_identifier6       => c_cost_resource_rec.item_number,
                               p_identifier7         => c_cost_resource_rec.resource_code,
                              -- p_identifier8       => c_cost_resource_rec.department_code,
                               p_process_status      => l_return_value,
                               p_error_message       => l_output_message
                              );
                     END;
                  ELSE
                     l_successful_recs_rsc := l_successful_recs_rsc + 1;
                  END IF;
    l_error_flag := 'N';
               END LOOP;
            END IF;

            -- Businesss Validation for Resource Overhead Table
            IF p_run_option = 'OHD' OR p_run_option = 'ALL' 
            THEN
               FOR c_resc_overhead_rec IN c_resc_overhead
               LOOP
                  IF c_resc_overhead_rec.overhead IS NOT NULL AND c_resc_overhead_rec.resource_code IS NOT NULL
                  THEN
                     l_processed_recs_rohd := l_processed_recs_rohd + 1;    --Counter for total records
                     -- Call to procedure for validation
                     XX_COMMON_VALIDATION_PRC
                                      (c_resc_overhead_rec.organization_code,
                                       c_resc_overhead_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                     XX_VALIDATE_RSC_OHD_PRC (c_resc_overhead_rec,
                                              l_header_id,
                                              l_error_flag
                                             );
                     IF l_error_flag = 'Y'
                     THEN
                        BEGIN
                           --Update Resource Overhead Pre-Interface Table
                           UPDATE XX_CST_RES_OVERHEADS_PREINT
                              SET status = 'ER'
                            WHERE resource_code     = c_resc_overhead_rec.resource_code
                              AND overhead          = c_resc_overhead_rec.overhead
                              AND organization_code = c_resc_overhead_rec.organization_code
     AND record_id         = c_resc_overhead_rec.record_id;
                        EXCEPTION
                           WHEN OTHERS
                           THEN
                              l_error_flag := 'Y';
                              xx_trace.h
                                 (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                  || SQLERRM
                                 );
                              xx_emf.call_store_message
                                 (p_message_group       => 'ERR_DTL',
                                  p_header_id           => l_header_id,
                                  p_debug_value         => 40,  -- High level debugging
                                  p_global_debug        => g_debug_level,
                                  p_identifier1         => 'E-12300',
                                  p_identifier2         => 'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                           || SQLERRM,
                                  p_identifier3         => c_resc_overhead_rec.record_id,
                                  p_identifier4         => c_resc_overhead_rec.organization_code,
                                  p_identifier5         => c_resc_overhead_rec.cost_type,
                                  -- p_identifier6      => c_resc_overhead_rec.item_number,
                                  p_identifier7         => c_resc_overhead_rec.resource_code,
                                  --p_identifier8       => c_resc_overhead_rec.department_code,
                                  p_process_status      => l_return_value,
                                  p_error_message       => l_output_message
                                 );
                        END;
                     ELSE
                        l_successful_recs_rohd := l_successful_recs_rohd + 1;
                     END IF;
                        l_error_flag := 'N';
                  END IF;
               END LOOP;
            END IF;

            -- Businesss Validation for Department Overhead Table
            IF p_run_option = 'OHD' OR p_run_option = 'ALL' 
            THEN
               FOR c_dept_overhead_rec IN c_dept_overhead
               LOOP
                  IF c_dept_overhead_rec.overhead IS NOT NULL AND c_dept_overhead_rec.department_code IS NOT NULL
                  THEN
                     l_processed_recs_dohd := l_processed_recs_dohd + 1;     --Counter for total records
                     -- Call to procedure for validation
                     XX_COMMON_VALIDATION_PRC
                                      (c_dept_overhead_rec.organization_code,
                                       c_dept_overhead_rec.cost_type,
                                       l_header_id,
                                       l_error_flag
                                      );
                     XX_VALIDATE_DEPT_OHD_PRC (c_dept_overhead_rec,
                                               l_header_id,
                                               l_error_flag
                                              );
                     IF l_error_flag = 'Y'
                     THEN
                        BEGIN
                           --Update Department Overhead Pre-Interface Table
                           UPDATE XX_CST_DEPT_OVERHEADS_PREINT
                              SET status = 'ER'
                            WHERE department_code   = c_dept_overhead_rec.department_code
                              AND overhead          = c_dept_overhead_rec.overhead
                              AND organization_code = c_dept_overhead_rec.organization_code
     AND record_id         = c_dept_overhead_rec.record_id;
                        EXCEPTION
                           WHEN OTHERS
                           THEN
                              l_error_flag := 'Y';
                              xx_trace.h
                                 (   ' Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                  || SQLERRM
                                 );
                              xx_emf.call_store_message
                                 (p_message_group       => 'ERR_DTL',
                                  p_header_id           => l_header_id,
                                  p_debug_value         => 40,           -- High level debugging
                                  p_global_debug        => g_debug_level,
                                  p_identifier1         => 'E-12300',
                                  p_identifier2         =>    'Exception While Updating Pre-Interface Table Status.Oracle Error-'
                                                           || SQLERRM,
                                  p_identifier3         => c_dept_overhead_rec.record_id,
                                  p_identifier4         => c_dept_overhead_rec.organization_code,
                                  p_identifier5         => c_dept_overhead_rec.cost_type,
                                 -- p_identifier6       => c_dept_overhead_rec.item_number,
                                 -- p_identifier7       => c_dept_overhead_rec.resource_code,
                                  p_identifier8         => c_dept_overhead_rec.department_code,
                                  p_process_status      => l_return_value,
                                  p_error_message       => l_output_message
                                 );
                        END;
                     ELSE
                        l_successful_recs_dohd := l_successful_recs_dohd + 1;
                     END IF;
                        l_error_flag := 'N';
                  END IF;
               END LOOP;
            END IF;
        --
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Unexpected Exception While Business Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 40,           -- High level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-12300',
                p_identifier2         =>    'Unexpected Exception While Business Validation.Oracle Error-'
                                         || SQLERRM,
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

--End of Business Validation Section
/*---------------------------------------------------------------------------------------
Move data into Oracle Interface Table / Public API
---------------------------------------------------------------------------------------*/
-- Insert all data into oracle interface table from pre interface table
      BEGIN
         IF p_run_option = 'ITM' OR p_run_option = 'ALL'
         THEN
            FOR c_details_preint_rec IN c_details_preint
            LOOP
               --deriving inventory_item_id
               BEGIN
                  SELECT   msi.inventory_item_id
                    INTO   l_inventory_item_id
                    FROM   mtl_system_items_b   msi
          , mtl_parameters     mp
                   WHERE   msi.segment1         = c_details_preint_rec.item_number
                     AND   mp.organization_id   = msi.organization_id
                     AND   mp.organization_code = c_details_preint_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Inventory item id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,  -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         => 'Exception While Retrieving Inventory item id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_details_preint_rec.record_id,
                         p_identifier4         => c_details_preint_rec.organization_code,
                         p_identifier5         => c_details_preint_rec.cost_type,
                         p_identifier6         => c_details_preint_rec.item_number,
                         p_identifier7         => c_details_preint_rec.resource_code,
                         -- p_identifier8      => c_details_preint_rec.department_code,
p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
               --
               INSERT INTO CST_ITEM_CST_DTLS_INTERFACE
                           (inventory_item_id,
                            cost_type_id,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            organization_id,
                            operation_sequence_id,
                            operation_seq_num,
                            department_id,
                            level_type,
                            activity_id,
                            resource_seq_num,
                            resource_id,
                            resource_rate,
                            item_units,
                            activity_units,
                            usage_rate_or_amount,
                            basis_type,
                            basis_resource_id,
                            basis_factor,
                            net_yield_or_shrinkage_factor,
                            item_cost,
                            cost_element_id,
                            rollup_source_type,
                            activity_context,
                            request_id,
                            organization_code,
                            cost_type,
                            inventory_item,
                            department,
                            activity,
                            resource_code,
                            basis_resource_code,
                            cost_element,
                            ERROR_TYPE,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            transaction_id,
                            process_flag,
                            item_number,
                            transaction_type,
                            yielded_cost,
                            ERROR_CODE,
                            error_explanation,
                            lot_size,
                            based_on_rollup_flag,
                            shrinkage_rate,
                            inventory_asset_flag,
                            error_flag,
                            group_description
                           )
                    VALUES (l_inventory_item_id,
                            c_details_preint_rec.cost_type_id,
                            c_details_preint_rec.last_update_date,
                            c_details_preint_rec.last_updated_by,
                            c_details_preint_rec.creation_date,
                            c_details_preint_rec.created_by,
                            c_details_preint_rec.last_update_login,
                            c_details_preint_rec.GROUP_ID,
                            c_details_preint_rec.organization_id,
                            c_details_preint_rec.operation_sequence_id,
                            c_details_preint_rec.operation_seq_num,
                            c_details_preint_rec.department_id,
                            c_details_preint_rec.level_type,
                            c_details_preint_rec.activity_id,
                            c_details_preint_rec.resource_seq_num,
                            c_details_preint_rec.resource_id,
                            c_details_preint_rec.resource_rate,
                            c_details_preint_rec.item_units,
                            c_details_preint_rec.activity_units,
                            c_details_preint_rec.usage_rate_or_amount,
                            c_details_preint_rec.basis_type,
                            c_details_preint_rec.basis_resource_id,
                            c_details_preint_rec.basis_factor,
                            c_details_preint_rec.net_yield_or_shrinkage_factor,
                            c_details_preint_rec.item_cost,
                            c_details_preint_rec.cost_element_id,
                            c_details_preint_rec.rollup_source_type,
                            c_details_preint_rec.activity_context,
                            c_details_preint_rec.request_id,
                            c_details_preint_rec.organization_code,
                            c_details_preint_rec.cost_type,
                            c_details_preint_rec.inventory_item_id,
                            c_details_preint_rec.department,
                            c_details_preint_rec.activity,
                            c_details_preint_rec.resource_code,
                            c_details_preint_rec.basis_resource_code,
                            c_details_preint_rec.cost_element,
                            c_details_preint_rec.ERROR_TYPE,
                            c_details_preint_rec.program_application_id,
                            c_details_preint_rec.program_id,
                            c_details_preint_rec.program_update_date,
                            c_details_preint_rec.attribute_category,
                            c_details_preint_rec.attribute1,
                            c_details_preint_rec.attribute2,
                            c_details_preint_rec.attribute3,
                            c_details_preint_rec.attribute4,
                            c_details_preint_rec.attribute5,
                            c_details_preint_rec.attribute6,
                            c_details_preint_rec.attribute7,
                            c_details_preint_rec.attribute8,
                            c_details_preint_rec.attribute9,
                            c_details_preint_rec.attribute10,
                            c_details_preint_rec.attribute11,
                            c_details_preint_rec.attribute12,
                            c_details_preint_rec.attribute13,
                            c_details_preint_rec.attribute14,
                            c_details_preint_rec.attribute15,
                            c_details_preint_rec.transaction_id,
                            c_details_preint_rec.process_flag,
                            c_details_preint_rec.item_number,
                            c_details_preint_rec.transaction_type,
                            c_details_preint_rec.yielded_cost,
                            c_details_preint_rec.ERROR_CODE,
                            c_details_preint_rec.error_explanation,
                            c_details_preint_rec.lot_size,
                            c_details_preint_rec.based_on_rollup_flag,
                            c_details_preint_rec.shrinkage_rate,
                            c_details_preint_rec.inventory_asset_flag,
                            c_details_preint_rec.error_flag,
                            c_details_preint_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         --
         IF p_run_option = 'RSC' OR p_run_option = 'ALL'
         THEN
            FOR c_cost_resource_rec IN c_cost_resource
            LOOP
               --deriving resource_id
               BEGIN
                  SELECT   resource_id
                    INTO   l_resource_id
                    FROM   bom_resources br
  ,org_organization_definitions  ood
                   WHERE   ood.organization_id   = br.organization_id
    AND   resource_code         = c_cost_resource_rec.resource_code
                     AND   ood.organization_code = c_cost_resource_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Resource id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,           -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         =>    'Exception While Retrieving Resource id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_cost_resource_rec.record_id,
                         p_identifier4         => c_cost_resource_rec.organization_code,
                         p_identifier5         => c_cost_resource_rec.cost_type,
                         -- p_identifier6      => c_cost_resource_rec.item_number,
                         --p_identifier7       => c_cost_resource_rec.resource_code,
                         --p_identifier8       => c_cost_resource_rec.department_code,
                         p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
               --
               INSERT INTO CST_RESOURCE_COSTS_INTERFACE
                           (resource_id, resource_code,
                            cost_type_id,
                            cost_type,
                            organization_id,
                            organization_code,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            transaction_id,
                            process_flag,
                            resource_rate,
                            request_id,
                            ERROR_CODE,
                            error_explanation,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            error_flag,
                            group_description
                           )
                    VALUES (l_resource_id, 
   c_cost_resource_rec.resource_code,
                            c_cost_resource_rec.cost_type_id,
                            c_cost_resource_rec.cost_type,
                            c_cost_resource_rec.organization_id,
                            c_cost_resource_rec.organization_code,
                            c_cost_resource_rec.last_update_date,
                            c_cost_resource_rec.last_updated_by,
                            c_cost_resource_rec.creation_date,
                            c_cost_resource_rec.created_by,
                            c_cost_resource_rec.last_update_login,
                            c_cost_resource_rec.GROUP_ID,
                            c_cost_resource_rec.transaction_id,
                            c_cost_resource_rec.process_flag,
                            c_cost_resource_rec.resource_rate,
                            c_cost_resource_rec.request_id,
                            c_cost_resource_rec.ERROR_CODE,
                            c_cost_resource_rec.error_explanation,
                            c_cost_resource_rec.program_application_id,
                            c_cost_resource_rec.program_id,
                            c_cost_resource_rec.program_update_date,
                            c_cost_resource_rec.attribute_category,
                            c_cost_resource_rec.attribute1,
                            c_cost_resource_rec.attribute2,
                            c_cost_resource_rec.attribute3,
                            c_cost_resource_rec.attribute4,
                            c_cost_resource_rec.attribute5,
                            c_cost_resource_rec.attribute6,
                            c_cost_resource_rec.attribute7,
                            c_cost_resource_rec.attribute8,
                            c_cost_resource_rec.attribute9,
                            c_cost_resource_rec.attribute10,
                            c_cost_resource_rec.attribute11,
                            c_cost_resource_rec.attribute12,
                            c_cost_resource_rec.attribute13,
                            c_cost_resource_rec.attribute14,
                            c_cost_resource_rec.attribute15,
                            c_cost_resource_rec.error_flag,
                            c_cost_resource_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         --
         --
         IF p_run_option = 'OHD' OR p_run_option = 'ALL'
         THEN
            FOR c_resc_overhead_rec IN c_resc_overhead
            LOOP
               --deriving resource_id
               IF c_resc_overhead_rec.resource_code IS NOT NULL
               THEN
                  BEGIN
                     SELECT   resource_id
                       INTO   l_resource_id
                       FROM   bom_resources br
     ,org_organization_definitions  ood
                      WHERE   br.organization_id    = ood.organization_id
AND   br.resource_code      = c_resc_overhead_rec.resource_code
                        AND   ood.organization_code = c_resc_overhead_rec.organization_code;
                  EXCEPTION
                     WHEN OTHERS
                     THEN
                        l_error_flag := 'Y';
                        xx_trace.h
                           (   ' Exception While Retrieving Resource id.Oracle Error-'
                            || SQLERRM
                           );
                        xx_emf.call_store_message
                           (p_message_group       => 'ERR_DTL',
                            p_header_id           => l_header_id,
                            p_debug_value         => 40,    -- High level debugging
                            p_global_debug        => g_debug_level,
                            p_identifier1         => 'E-12300',
                            p_identifier2         =>    'Exception While Retrieving Resource id.Oracle Error-'
                                                     || SQLERRM,
                            p_identifier3         => c_resc_overhead_rec.record_id,
                            p_identifier4         => c_resc_overhead_rec.organization_code,
                            p_identifier5         => c_resc_overhead_rec.cost_type,
                            -- p_identifier6      => c_resc_overhead_rec.item_number,
                            p_identifier7         => c_resc_overhead_rec.resource_code,
                            -- p_identifier8      => c_resc_overhead_rec.department_code,
                            p_process_status      => l_return_value,
                            p_error_message       => l_output_message
                           );
                  END;
               END IF;
               --
               INSERT INTO CST_RES_OVERHEADS_INTERFACE
                           (resource_id, resource_code,
                            cost_type_id,
                            cost_type,
                            organization_id,
                            organization_code,
                            overhead_id,
                            overhead,
                            last_update_date,
                            last_updated_by,
                            creation_date,
                            created_by,
                            last_update_login,
                            GROUP_ID,
                            transaction_id,
                            process_flag,
                            request_id,
                            ERROR_CODE,
                            error_explanation,
                            program_application_id,
                            program_id,
                            program_update_date,
                            attribute_category,
                            attribute1,
                            attribute2,
                            attribute3,
                            attribute4,
                            attribute5,
                            attribute6,
                            attribute7,
                            attribute8,
                            attribute9,
                            attribute10,
                            attribute11,
                            attribute12,
                            attribute13,
                            attribute14,
                            attribute15,
                            error_flag,
                            group_description
                           )
                    VALUES (l_resource_id, 
           c_resc_overhead_rec.resource_code,
                            c_resc_overhead_rec.cost_type_id,
                            c_resc_overhead_rec.cost_type,
                            c_resc_overhead_rec.organization_id,
                            c_resc_overhead_rec.organization_code,
                            c_resc_overhead_rec.overhead_id,
                            c_resc_overhead_rec.overhead,
                            c_resc_overhead_rec.last_update_date,
                            c_resc_overhead_rec.last_updated_by,
                            c_resc_overhead_rec.creation_date,
                            c_resc_overhead_rec.created_by,
                            c_resc_overhead_rec.last_update_login,
                            c_resc_overhead_rec.GROUP_ID,
                            c_resc_overhead_rec.transaction_id,
                            c_resc_overhead_rec.process_flag,
                            c_resc_overhead_rec.request_id,
                            c_resc_overhead_rec.ERROR_CODE,
                            c_resc_overhead_rec.error_explanation,
                            c_resc_overhead_rec.program_application_id,
                            c_resc_overhead_rec.program_id,
                            c_resc_overhead_rec.program_update_date,
                            c_resc_overhead_rec.attribute_category,
                            c_resc_overhead_rec.attribute1,
                            c_resc_overhead_rec.attribute2,
                            c_resc_overhead_rec.attribute3,
                            c_resc_overhead_rec.attribute4,
                            c_resc_overhead_rec.attribute5,
                            c_resc_overhead_rec.attribute6,
                            c_resc_overhead_rec.attribute7,
                            c_resc_overhead_rec.attribute8,
                            c_resc_overhead_rec.attribute9,
                            c_resc_overhead_rec.attribute10,
                            c_resc_overhead_rec.attribute11,
                            c_resc_overhead_rec.attribute12,
                            c_resc_overhead_rec.attribute13,
                            c_resc_overhead_rec.attribute14,
                            c_resc_overhead_rec.attribute15,
                            c_resc_overhead_rec.error_flag,
                            c_resc_overhead_rec.group_description
                           );
            END LOOP;
         END IF;
         --
         FOR c_dept_overhead_rec IN c_dept_overhead
         LOOP
            --deriving resource_id
            IF (c_dept_overhead_rec.department_code IS NOT NULL)
            THEN
               BEGIN
                  --
                  SELECT   department_id
                    INTO   l_department_id
                    FROM   bom_departments    bd
  ,org_organization_definitions ood
                   WHERE   bd.organization_id    = ood.organization_id
    AND   bd.department_code    = c_dept_overhead_rec.department_code
                     AND   ood.organization_code = c_dept_overhead_rec.organization_code;
               EXCEPTION
                  WHEN OTHERS
                  THEN
                     l_error_flag := 'Y';
                     xx_trace.h
                        (   ' Exception While Retrieving Department id.Oracle Error-'
                         || SQLERRM
                        );
                     xx_emf.call_store_message
                        (p_message_group       => 'ERR_DTL',
                         p_header_id           => l_header_id,
                         p_debug_value         => 40,      -- High level debugging
                         p_global_debug        => g_debug_level,
                         p_identifier1         => 'E-12300',
                         p_identifier2         => 'Exception While Retrieving Department id.Oracle Error-'
                                                  || SQLERRM,
                         p_identifier3         => c_dept_overhead_rec.record_id,
                         p_identifier4         => c_dept_overhead_rec.organization_code,
                         p_identifier5         => c_dept_overhead_rec.cost_type,
                         -- p_identifier6      => c_dept_overhead_rec.item_number,
                         --p_identifier7       => c_dept_overhead_rec.resource_code,
                         p_identifier8         => c_dept_overhead_rec.department_code,
                         p_process_status      => l_return_value,
                         p_error_message       => l_output_message
                        );
               END;
            END IF;
            --
            INSERT INTO CST_DEPT_OVERHEADS_INTERFACE
                        (department_id,
                         department_code,
                         cost_type_id,
                         cost_type,
                         organization_id,
                         organization_code,
                         overhead_id,
                         overhead,
                         last_update_date,
                         last_updated_by,
                         creation_date,
                         created_by,
                         last_update_login,
                         GROUP_ID,
                         transaction_id,
                         process_flag,
                         basis_type,
                         rate_or_amount,
                         activity_id,
                         activity,
                         request_id,
                         ERROR_CODE,
                         error_explanation,
                         program_application_id,
                         program_id,
                         program_update_date,
                         attribute_category,
                         attribute1,
                         attribute2,
                         attribute3,
                         attribute5,
                         attribute6,
                         attribute7,
                         attribute8,
                         attribute9,
                         attribute10,
                         attribute11,
                         attribute12,
                         attribute13,
                         attribute14,
                         attribute15,
                         error_flag,
                         group_description
                        )
                 VALUES (l_department_id,
                         c_dept_overhead_rec.department_code,
                         c_dept_overhead_rec.cost_type_id,
                         c_dept_overhead_rec.cost_type,
                         c_dept_overhead_rec.organization_id,
                         c_dept_overhead_rec.organization_code,
                         c_dept_overhead_rec.overhead_id,
                         c_dept_overhead_rec.overhead,
                         c_dept_overhead_rec.last_update_date,
                         c_dept_overhead_rec.last_updated_by,
                         c_dept_overhead_rec.creation_date,
                         c_dept_overhead_rec.created_by,
                         c_dept_overhead_rec.last_update_login,
                         c_dept_overhead_rec.GROUP_ID,
                         c_dept_overhead_rec.transaction_id,
                         c_dept_overhead_rec.process_flag,
                         c_dept_overhead_rec.basis_type,
                         c_dept_overhead_rec.rate_or_amount,
                         c_dept_overhead_rec.activity_id,
                         c_dept_overhead_rec.activity,
                         c_dept_overhead_rec.request_id,
                         c_dept_overhead_rec.ERROR_CODE,
                         c_dept_overhead_rec.error_explanation,
                         c_dept_overhead_rec.program_application_id,
                         c_dept_overhead_rec.program_id,
                         c_dept_overhead_rec.program_update_date,
                         c_dept_overhead_rec.attribute_category,
                         c_dept_overhead_rec.attribute1,
                         c_dept_overhead_rec.attribute2,
                         c_dept_overhead_rec.attribute3,
                         c_dept_overhead_rec.attribute5,
                         c_dept_overhead_rec.attribute6,
                         c_dept_overhead_rec.attribute7,
                         c_dept_overhead_rec.attribute8,
                         c_dept_overhead_rec.attribute9,
                         c_dept_overhead_rec.attribute10,
                         c_dept_overhead_rec.attribute11,
                         c_dept_overhead_rec.attribute12,
                         c_dept_overhead_rec.attribute13,
                         c_dept_overhead_rec.attribute14,
                         c_dept_overhead_rec.attribute15,
                         c_dept_overhead_rec.error_flag,
                         c_dept_overhead_rec.group_description
                        );
         END LOOP;
         COMMIT;
      EXCEPTION
         WHEN OTHERS
         THEN
            l_error_flag := 'Y';
            xx_trace.h
               (   'Exception While Inserting into Interface Table.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00004',
                p_identifier2         => 'Exception While Inserting into INTERFACE TABLE.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            RAISE;
      END;

/*----------------------------------------------------------------------------------
    --Updating pre interface table with status 'PR' where record_status in IP'
  ----------------------------------------------------------------------------------*/
      --Update Item Cost Details Preinterface Table
      IF p_run_option = 'ITM' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_ITEM_DTLS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Resource Cost Preinterface Table
      IF p_run_option = 'RSC' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_RESOURCE_COSTS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Resource Overhead Preinterface Table
      IF p_run_option = 'OHD' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_RES_OVERHEADS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
      --
      --Update Department Overhead Preinterface Table
      IF p_run_option = 'OHD' OR p_run_option = 'ALL'
      THEN
         BEGIN
            UPDATE XX_CST_DEPT_OVERHEADS_PREINT
               SET status = 'PR'
             WHERE status = 'IP';
               xx_trace.l ('Pre-Interface Table status updated to PR');
         EXCEPTION
            WHEN OTHERS
            THEN
               l_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => l_header_id,
                   p_debug_value         => 40,        -- High level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00004',
                   p_identifier2         =>    'Exception While Updating Pre-Interface Table Status to PR.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => NULL,      -- Can be utilized to store record serial number
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;

      --Initialize apps
      --fnd_global.apps_initialize (l_user_id, l_resp_id, l_appl_id);
      XX_COMMON_VALIDATIONS_PKG.INIT_APPS_PARAMS
                                        (p_request_id          => l_request_id,
                                         p_process_status      => l_process_status,
                                         p_error_message       => l_output_message
                                        );

/*---------------------------------------------------------------------------------------
Launch Standard Concurrent Program - With WAIT/Call Oracle Standard APIs
----------------------------------------------------------------------------------------*/
     BEGIN
     SELECT COUNT (*)
     INTO l_count
     FROM XX_CST_ITEM_DTLS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_RESOURCE_COSTS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_RES_OVERHEADS_PREINT
     WHERE status = 'PR';
     --
     SELECT DECODE(l_count,0,count(*),l_count)
     INTO l_count
     FROM XX_CST_DEPT_OVERHEADS_PREINT
     WHERE status = 'PR';
 --
 --   
         IF l_count > 0 
         THEN
            SELECT  DECODE (p_run_option, 'ITM', 1, 'RSC', 2, 'OHD', 3, 4)
              INTO  l_run_option
              FROM  DUAL;
               --
      l_standard_request_id :=
               fnd_request.submit_request
                             (application      => 'BOM',
                              program          => 'CSTPCIMP',
                              description      => NULL,
                              start_time       => NULL,
                              sub_request      => FALSE,
                              argument1        => l_run_option,  -- Import cost option
                              argument2        => 2,             -- Mode to run this request
                              argument3        => 2,             -- Group ID option
                              argument4        => NULL,          -- Group ID Dummy
                              argument5        => NULL,          -- Group ID
                              argument6        => p_cost_type,   -- Cost type to import to
                              argument7        => 2              -- Delete successful rows
                             );
            COMMIT;
            
            --Wait for the completion of the concurrent request (if submitted successfully)
            l_completed :=
               fnd_concurrent.wait_for_request
                                         (request_id      => l_standard_request_id,
                                          INTERVAL        => 60,
                                          max_wait        => 0,
                                          phase           => l_phase,
                                          status          => l_vstatus,
                                          dev_phase       => l_dev_phase,
                                          dev_status      => l_dev_status,
                                          MESSAGE         => l_message
                                         );
            xx_trace.l (   'Request submitted with request id-'
                        || l_standard_request_id
                       );
         ELSE
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => l_header_id,
                p_debug_value         => 20,            -- Low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00004',
                p_identifier2         => 'No records To Process in Interface Table',
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         END IF;
      END;
 /*----------------------------------------------------------------------------
 Delete the Processed records from the Pre-interface table
 ----------------------------------------------------------------------------*/
    BEGIN
      IF ((p_run_option = 'ALL') OR (p_run_option = 'ITM'))
      THEN
        DELETE FROM XX_CST_ITEM_DTLS_PREINT
        WHERE status = 'PR';
      END IF;
      --
      IF ((p_run_option = 'ALL') OR (p_run_option = 'RSC'))
      THEN
        DELETE FROM XX_CST_RESOURCE_COSTS_PREINT
        WHERE status = 'PR';
      END IF;
      --
      IF ((p_run_option = 'ALL') OR (p_run_option = 'OHD'))
      THEN
        DELETE FROM XX_CST_RES_OVERHEADS_PREINT
        WHERE status = 'PR';
        DELETE FROM XX_CST_DEPT_OVERHEADS_PREINT
        WHERE status = 'PR';
      END IF;
      --
    EXCEPTION
      WHEN OTHERS
      THEN
        xx_trace.h
          (' Exception While deleting processed records from Pre-Interface Table(s)'
           || SQLERRM
          );
        xx_emf.call_store_message
          (p_message_group      => 'ERR_DTL'
         , p_header_id          => l_header_id
         , p_debug_value        => 40   -- High level debugging
         , p_global_debug       => g_debug_level
         , p_identifier1        => 'E-00004'
         , p_identifier2        => ' Exception While deleting processed records from Pre-Interface Table(s)'
                                   || SQLERRM
         , p_identifier3        => NULL -- Can be utilized to store record serial number
         , p_process_status     => l_return_value
         , p_error_message      => l_output_message
          );
    END;
/*----------------------------------------------------------------------------
 Call Insert Summary Count
 Purpose: Display a summary of records processed, successful and in error
 ----------------------------------------------------------------------------*/
    IF ((p_run_option = 'ALL') OR (p_run_option = 'ITM'))
    THEN
      l_error_recs_itm := l_processed_recs_itm - l_successful_recs_itm;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Item Cost)'
                                  , p_total_recs          => l_processed_recs_itm
                                  , p_successful_recs     => l_successful_recs_itm
                                  , p_error_recs          => l_error_recs_itm
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Item Cost');
      END IF;
      --
    END IF;
    --
    IF ((p_run_option = 'ALL') OR (p_run_option = 'RSC'))
    THEN
      l_error_recs_rsc := l_processed_recs_rsc - l_successful_recs_rsc;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Resource Cost)'
                                  , p_total_recs          => l_processed_recs_rsc
                                  , p_successful_recs     => l_successful_recs_rsc
                                  , p_error_recs          => l_error_recs_rsc
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Resource Cost');
      END IF;
      --
    END IF;
    --
    IF ((p_run_option = 'ALL') OR (p_run_option = 'OHD'))
    THEN
      l_error_recs_rohd := l_processed_recs_rohd - l_successful_recs_rohd;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Resource Overhead)'
                                  , p_total_recs          => l_processed_recs_rohd
                                  , p_successful_recs     => l_successful_recs_rohd
                                  , p_error_recs          => l_error_recs_rohd
                                   );

      l_error_recs_dohd := l_processed_recs_dohd - l_successful_recs_dohd;
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
      --
      l_return_value :=
      xx_emf.insert_summary_counts (p_header_id           => l_header_id
                                  , p_display_name        => l_program_name||' (Department Overhead)'
                                  , p_total_recs          => l_processed_recs_dohd
                                  , p_successful_recs     => l_successful_recs_dohd
                                  , p_error_recs          => l_error_recs_dohd
                                   );

      --
      IF l_return_value = 1
      THEN
        l_warning_flag := 'W';
        xx_trace.l ('Failed to Insert Summary Count for Overhead Cost');
      END IF;
      --
     END IF;

/*-----------------------------------------------------------------------------------------
      Call flush PL/SQL table section
      Purpose : Flush data from pl/sql table isrespective of the count.
      Special Logic : record's message group is passed as 'ALL' and rest all columns are null
-------------------------------------------------------------------------------------------*/
      xx_emf.call_store_message (p_message_group       => 'ALL',
                                 p_header_id           => l_header_id,
                                 p_debug_value         => 20,
                                 p_global_debug        => g_debug_level,
                                 p_identifier1         => 'Flushing Data into EMF',
                                 p_process_status      => l_return_value,
                                 p_error_message       => l_output_message
                                );

      IF l_return_value = 1
      THEN
         l_warning_flag := 'W';
         xx_trace.l ('Failed to print EMF messages on the output');
      END IF;

      --
      l_messages_rec := l_null_rec;
      l_return_value := NULL;
/*----------------------------------------------------------------------------
    Set display width for output
    Purpose: Call to set EMF error and report section column widths
 --------------------------------------------------------------------------*/
      l_err_width_rec.identifier1 := TO_CHAR (g_err_col1_width);
      l_err_width_rec.identifier2 := TO_CHAR (g_err_col2_width);
      l_err_width_rec.identifier3 := TO_CHAR (g_err_col3_width);
      l_err_width_rec.identifier4 := TO_CHAR (g_err_col4_width);
      l_err_width_rec.identifier5 := TO_CHAR (g_err_col5_width);
      l_err_width_rec.identifier6 := TO_CHAR (g_err_col6_width);
      l_err_width_rec.identifier7 := TO_CHAR (g_err_col7_width);
      l_err_width_rec.identifier8 := TO_CHAR (g_err_col8_width);
     --
/*----------------------------------------------------------------
    Call to xx_emf.display_output_messages
       Purpose--Call to generate output file (Errors/Messages)
--------------------------------------------------------------*/
      l_err_width_rec.header_id := l_header_id;
      l_return_value :=
         xx_emf.display_output_messages (p_header_id          => l_header_id,
                                         p_err_width_rec      => l_err_width_rec
                                        );

      IF l_return_value = 1
      THEN
         l_error_flag := 'Y';
         xx_trace.l ('Failed to display output messages');
      END IF;

      --
      l_return_value := NULL;

    --
/*---------------------------------------------------
    Call ToEMF Update_program_status in EMF tables
-----------------------------------------------------*/
      IF l_error_flag = 'Y'
      THEN                                                             --ERROR
         l_warning_flag := '';              --error status supercedes warning
         l_status := 'ERROR';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status');
            l_return_value := NULL;
         END IF;
      ELSIF l_warning_flag = 'W'
      THEN
         l_status := 'WARNING';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status');
            l_return_value := NULL;
         END IF;
      ELSIF l_error_flag = 'N'
      THEN
         l_status := 'SUCCESS';
         l_return_value := NULL;
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         --
         IF l_return_value = 1
         THEN
            xx_trace.l ('Failed to update program status for Success');
         END IF;

         COMMIT;
      END IF;
   EXCEPTION                                                  --Main Exception
   --Call emf_initialize_error if EMF header fails
      WHEN e_emf_initialize_error
      THEN
         xx_trace.l ('Failed to initialize EMF');
   --Call emf_initialize_detail_error if EMF error/report detail fails
      WHEN e_emf_initialize_detail_error
      THEN
         l_status := 'ERROR';
         l_return_value :=
                         xx_emf.update_program_status (l_header_id, l_status);
         xx_trace.l ('Failed to insert EMF error header');
   --Main Exception Block
      WHEN OTHERS
      THEN
--Write to error
         l_error_flag := 'Y';
         xx_emf.call_store_message
                                  (p_message_group       => 'ERR_DTL',
                                   p_header_id           => l_header_id,
                                   p_debug_value         => 40,         --High level debugging
                                   p_global_debug        => g_debug_level,
                                   p_identifier1         => 'E-00004',
                                   p_identifier2         =>    'Exception in Main.'
                                                            || SQLERRM
                                                            || SQLERRM,
                                   p_process_status      => l_return_value,
                                   p_error_message       => l_output_message
                                  );
         --
         l_messages_rec := l_null_rec;
         l_return_value := NULL;

/*-----------------------------------------------------------------------------------------
    Call flush PL/SQL table section
    Purpose : Flush data from pl/sql table isrespective of the count.
    Special Logic : record's message group is passed as 'ALL' and rest all columns are null
-------------------------------------------------------------------------------------------*/
         xx_emf.call_store_message (p_message_group       => 'ALL',
                                    p_header_id           => l_header_id,
                                    p_debug_value         => 20,          --Low level debugging
                                    p_global_debug        => g_debug_level,
                                    p_identifier1         => 'Flushing Data into EMF',
                                    p_process_status      => l_return_value,
                                    p_error_message       => l_output_message
                                   );

         IF l_return_value = 1
         THEN
            l_return_value := NULL;
            xx_trace.h ('Unable to call EMF error log');
            l_return_value :=
                         xx_emf.update_program_status (l_header_id, l_status);
         END IF;

         l_return_value := NULL;
/*----------------------------------------------------------------------------
Purpose: Call to set EMF error and report section column widths
--------------------------------------------------------------------------*/
         l_err_width_rec.identifier1 := TO_CHAR (g_err_col1_width);
         l_err_width_rec.identifier2 := TO_CHAR (g_err_col2_width);
         l_err_width_rec.identifier3 := TO_CHAR (g_err_col3_width);
         l_err_width_rec.identifier4 := TO_CHAR (g_err_col4_width);
         l_err_width_rec.identifier5 := TO_CHAR (g_err_col5_width);
         l_err_width_rec.identifier6 := TO_CHAR (g_err_col6_width);
         l_err_width_rec.identifier7 := TO_CHAR (g_err_col7_width);
         l_err_width_rec.identifier8 := TO_CHAR (g_err_col8_width);
/*----------------------------------------------------------------
Purpose--Call to generate output file (Errors/Messages)
--------------------------------------------------------------*/
         l_err_width_rec.header_id := l_header_id;
         l_return_value :=
            xx_emf.display_output_messages (p_header_id          => l_header_id,
                                            p_err_width_rec      => l_err_width_rec
                                           );

         IF l_return_value = 1
         THEN
            xx_trace.h ('Unable to display output messages');
         END IF;

         l_return_value := NULL;
/*-------------------------------------------------------------------
  Call update program status
---------------------------------------------------------------------*/
         l_status := 'ERROR';
         l_return_value :=
            xx_emf.update_program_status (p_header_id      => l_header_id,
                                          p_status         => l_status
                                         );

         IF l_return_value = 1
         THEN
            xx_trace.h ('Unable to update program status');
            l_return_value := NULL;
         END IF;
   END main;

/*******************************************************************************
* Procedure Name :   XX_COMMON_VALIDATION_PRC
* Purpose        :   This program will validate data
*               to be inserted Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_COMMON_VALIDATION_PRC (
      p_organization_code   IN OUT   xx_cst_item_dtls_preint.organization_code%TYPE,
      p_cost_type           IN OUT   xx_cst_item_dtls_preint.cost_type%TYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_organization_id     NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                            := 0;
      l_interface_stg_rec   xx_cst_item_dtls_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_cost_type_id        NUMBER;
   --  
   --  
   BEGIN
      --
      p_error_flag := 'N';
      --Validation of organization Code
      BEGIN
         l_value := NULL;
        BEGIN
            SELECT  organization_id
              INTO  l_organization_id
              FROM  mtl_parameters
             WHERE  organization_code = p_organization_code;
         EXCEPTION
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   ' Exception occured while retrieving organization id for given organization code.Oracle Error-'
                   || SQLERRM
                  );
         END;
--  
         XX_COMMON_VALIDATIONS_PKG.VALIDATE_ORGANIZATION
                                  (p_organization_name      => l_value,
                                   p_organization_code      => p_organization_code,
                                   p_organization_id        => l_organization_id,
                                   p_process_status         => l_process_status,
                                   p_error_message          => l_output_message
                                  );
IF l_process_status = 1
         THEN
   p_error_flag := 'Y';
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Error in Validating Organization Code'
                                         || l_output_message,
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,          -- Can be utilized for displaying more information
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         --  
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   ' Exception occured while validating for organization.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception occured while validating for organization.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,         -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,          -- Can be utilized for displaying more information
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
      --Vilidation Of Cost type
      BEGIN
         --
         SELECT a.cost_type_id
           INTO l_cost_type_id
           FROM cst_cost_types a
          WHERE a.cost_type = p_cost_type;
      --
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                      ('Cost type does not exist for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Cost type does not exist for the Organization given',
                p_identifier3         => NULL,          -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
                p_identifier6         => NULL,           -- Can be utilized for displaying more information
                p_identifier7         => NULL,           -- Can be utilized for displaying more information
p_identifier8         => NULL,           -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Validating Cost Type.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Cost Type.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => NULL,             -- Can be utilized to store record serial number
                p_identifier4         => p_organization_code,
                p_identifier5         => p_cost_type,
p_identifier6         => NULL,               -- Can be utilized for displaying more information
                p_identifier7         => NULL,               -- Can be utilized for displaying more information
                p_identifier8         => NULL,               -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in Organization Code and Cost Type Validation Procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_COMMON_VALIDATION_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_ITM_COST_PRC
* Purpose        :   This program will validate data
*               to be inserted into the Cost Details tables..
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_ITM_COST_PRC (
      p_details_preint_rec   IN OUT   xx_cst_item_dtls_preint%ROWTYPE,
      p_header_id            IN       NUMBER,
      p_error_flag           OUT      VARCHAR2
   )
   IS
      l_inventory_item_id   NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                            := 0;
      l_interface_stg_rec   xx_cst_item_dtls_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_cost_element_id     NUMBER;
   BEGIN
      --1 Begin
      --p_error_flag := 'N';

      --
      -- Validation of Item Number
      BEGIN
 
         SELECT   inventory_item_id
           INTO   l_inventory_item_id
           FROM   mtl_system_items_b    msi
 ,org_organization_definitions   ood
          WHERE   msi.organization_id   = ood.organization_id
   AND   msi.segment1          = p_details_preint_rec.item_number
            AND   ood.organization_code = p_details_preint_rec.organization_code;
      --
      EXCEPTION
         --
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Item Does Not Exist For the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Item Does Not Exist for the Organization given',
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Item Segment .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Item Segment .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;

      -- Validating Cost Element
      BEGIN
         --
         SELECT DISTINCT   a.cost_element_id
                    INTO   l_cost_element_id
                    FROM   cst_cost_elements a,
                           cst_item_cost_details b,
                           org_organization_definitions od
                   WHERE   a.cost_element_id    = b.cost_element_id
                     AND   od.organization_id   = b.organization_id
                     AND   od.organization_code = p_details_preint_rec.organization_code
                     AND   a.cost_element       = 'Material'
                     AND   a.cost_element       = p_details_preint_rec.cost_element;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            --
            p_error_flag := 'Y';
            xx_trace.l ('Cost Element is not valid for Item Cost Import.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Cost Element is not valid for Item Cost Import',
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Cost Element Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Cost Element.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_details_preint_rec.record_id,
                p_identifier4         => p_details_preint_rec.organization_code,
                p_identifier5         => p_details_preint_rec.cost_type,
                p_identifier6         => p_details_preint_rec.item_number,
                p_identifier7         => NULL,          -- Can be utilized for displaying more information
                p_identifier8         => NULL,          -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate cost procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_ITM_COST_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_COST_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Resource Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_RSC_COST_PRC (
      p_cost_resource_rec   IN OUT   xx_cst_resource_costs_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_resource_id                NUMBER;
      l_functional_currency_flag   NUMBER;
      l_return_value               NUMBER;
      l_output_message             VARCHAR2 (1000);
      l_process_status             NUMBER                                := 0;
      l_interface_stg_rec          xx_cst_resource_costs_preint%ROWTYPE;
      l_value                      VARCHAR2 (50);
   BEGIN
      --1 Begin
      --p_error_flag := 'N';
      --
      --
      --
      -- Validation of Resource Code
      BEGIN
       --
       SELECT  resource_id,functional_currency_flag     
         INTO  l_resource_id,l_functional_currency_flag            
         FROM  bom_resources br                   
               ,org_organization_definitions ood  
        WHERE  br.organization_id = ood.organization_id
          AND  organization_code  = p_cost_resource_rec.organization_code            
          AND  resource_code      = p_cost_resource_rec.resource_code;        
       --
       IF l_functional_currency_flag = 1
       THEN                           
         IF p_cost_resource_rec.resource_rate IS NOT NULL
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Resource rate should be NULL for Functional Currency Flag set to 1.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,              -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource rate should be NULL for Functional Currency Flag set to 1.',
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,           -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         END IF;
        END IF;
      --
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                  ('Resource Code does not exists for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource Code does not exist for the Organization given.',
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,            -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Resource Code  .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Resource Code .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_cost_resource_rec.record_id,
                p_identifier4         => p_cost_resource_rec.organization_code,
                p_identifier5         => p_cost_resource_rec.cost_type,
                p_identifier6         => NULL,            -- Can be utilized for displaying more information
                p_identifier7         => p_cost_resource_rec.resource_code,
                p_identifier8         => NULL,            -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Resource Cost procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_RSC_COST_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_RSC_OHD_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Resource Overhead Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_RSC_OHD_PRC (
      p_resc_overhead_rec   IN OUT   xx_cst_res_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_resource_id         NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                                := 0;
      l_interface_stg_rec   xx_cst_res_overheads_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_overhead_id         NUMBER;
   BEGIN
      --p_error_flag := 'N';

      -- Validation of Resource Code
      BEGIN
         SELECT   resource_id
           INTO   l_resource_id
           FROM   bom_resources br
 ,org_organization_definitions  ood
          WHERE   ood.organization_id   = br.organization_id
   AND   br.resource_code      = p_resc_overhead_rec.resource_code
            AND   ood.organization_code = p_resc_overhead_rec.organization_code;
      --
      EXCEPTION
         --
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l
                  ('Resource Code does not exist for the Organization given.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,            -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Resource Code does not exist for the Organization given',
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
            NULL;
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Occured While Validating Resource Code  .Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Occured While Validating Resource Code .Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      --
      END;

      -- Validating Resource Overhead
      BEGIN
         --
    SELECT    bomr.resource_id
      INTO    l_overhead_id
               FROM    bom_resources bomr
                       ,org_organization_definitions ood 
              WHERE    ood.organization_id   =  bomr.organization_id 
                AND    ood.organization_code =  p_resc_overhead_rec.organization_code
                AND    bomr.resource_code    =  p_resc_overhead_rec.overhead 
                AND    bomr.cost_element_id in (2,5); 
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            p_error_flag := 'Y';
            xx_trace.l ('Overhead does not exist for the organization and cannot be assigned to a resource.');
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,                -- low level debugging
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         => 'Overhead does not exist for the organization and cannot be assigned to a resource.',
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,             -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,             -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
         WHEN OTHERS
         THEN
            p_error_flag := 'Y';
            xx_trace.h
               (   'Exception Ocurred While Rescource Overhead Validation.Oracle Error-'
                || SQLERRM
               );
            xx_emf.call_store_message
               (p_message_group       => 'ERR_DTL',
                p_header_id           => p_header_id,
                p_debug_value         => 20,
                p_global_debug        => g_debug_level,
                p_identifier1         => 'E-00003',
                p_identifier2         =>    'Exception Ocurred While Validating Rescource Overhead.Oracle Error-'
                                         || SQLERRM,
                p_identifier3         => p_resc_overhead_rec.record_id,
                p_identifier4         => p_resc_overhead_rec.organization_code,
                p_identifier5         => p_resc_overhead_rec.cost_type,
                p_identifier6         => NULL,         -- Can be utilized for displaying more information
                p_identifier7         => p_resc_overhead_rec.resource_code,
                p_identifier8         => NULL,         -- Can be utilized for displaying more information
                p_process_status      => l_return_value,
                p_error_message       => l_output_message
               );
      END;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Resource Overhead procedure.
             Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_RSC_OHD_PRC;

/*******************************************************************************
* Procedure Name :   XX_VALIDATE_DEPT_OHD_PRC
* Purpose        :   This program will validate data
*              to be inserted into the Department Overhead Cost Details tables.
*
*******************************************************************************/
   PROCEDURE XX_VALIDATE_DEPT_OHD_PRC (
      p_dept_overhead_rec   IN OUT   xx_cst_dept_overheads_preint%ROWTYPE,
      p_header_id           IN       NUMBER,
      p_error_flag          OUT      VARCHAR2
   )
   IS
      l_department_id       NUMBER;
      l_return_value        NUMBER;
      l_output_message      VARCHAR2 (1000);
      l_process_status      NUMBER                                 := 0;
      l_interface_stg_rec   xx_cst_dept_overheads_preint%ROWTYPE;
      l_value               VARCHAR2 (50);
      l_overhead_id         NUMBER;
   BEGIN
      --p_error_flag := 'N';
      -- Validation of Department Code
      IF (p_dept_overhead_rec.department_code IS NOT NULL)
      THEN
         BEGIN
            --
            SELECT   bd.department_id
              INTO   l_department_id
              FROM   bom_departments bd
            ,org_organization_definitions ood 
             WHERE   ood.organization_id   = bd.organization_id
      AND   bd.department_code    = p_dept_overhead_rec.department_code
               AND   ood.organization_code = p_dept_overhead_rec.organization_code;
         EXCEPTION
            --
            WHEN NO_DATA_FOUND
            THEN
               p_error_flag := 'Y';
               xx_trace.l
                     ('Department does not exist for the Organization given.');
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,         -- low level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         => 'Department does not exists for the Organization given',
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
               NULL;
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   'Exception Occured While Validating Department Code .Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         =>    'Exception Occured While Validating Department Code .Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;

      -- Validating Department Overhead
      IF (p_dept_overhead_rec.overhead IS NOT NULL)
      THEN
         BEGIN
            --
             SELECT    bomr.resource_id
      INTO    l_overhead_id
               FROM    bom_resources bomr
                       ,org_organization_definitions ood 
              WHERE    ood.organization_id   =  bomr.organization_id 
                AND    ood.organization_code =  p_dept_overhead_rec.organization_code
                AND    bomr.resource_code    =  p_dept_overhead_rec.overhead 
                AND    bomr.cost_element_id  =  5 ;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               p_error_flag := 'Y';
               xx_trace.l ('Overhead does not exist for the organization and cannot be assigned to a department.');
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,         -- low level debugging
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         => 'Overhead does not exist for the organization and cannot be assigned to a department',
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
            WHEN OTHERS
            THEN
               p_error_flag := 'Y';
               xx_trace.h
                  (   'Exception Ocurred While Department Overhead Validation.Oracle Error-'
                   || SQLERRM
                  );
               xx_emf.call_store_message
                  (p_message_group       => 'ERR_DTL',
                   p_header_id           => p_header_id,
                   p_debug_value         => 20,
                   p_global_debug        => g_debug_level,
                   p_identifier1         => 'E-00003',
                   p_identifier2         =>    'Exception Ocurred While Validating Department Overhead.Oracle Error-'
                                            || SQLERRM,
                   p_identifier3         => p_dept_overhead_rec.record_id,
                   p_identifier4         => p_dept_overhead_rec.organization_code,
                   p_identifier5         => p_dept_overhead_rec.cost_type,
                   p_identifier6         => NULL,        -- Can be utilized for displaying more information
                   p_identifier7         => NULL,        -- Can be utilized for displaying more information
                   p_identifier8         => p_dept_overhead_rec.department_code,
                   p_process_status      => l_return_value,
                   p_error_message       => l_output_message
                  );
         END;
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         p_error_flag := 'Y';
         xx_trace.l
            (   'Exception in validate Department Overhead procedure.
       Oracle Error'
             || SQLERRM
            );
   END XX_VALIDATE_DEPT_OHD_PRC;
END XX_INVCNV02_COST_UPLOAD_PKG;
/

PL/SQL - procedure and function specification

CREATE OR REPLACE PACKAGE xx_bom_import_pkg
AS
/*
-------------------------------------------------------------
Package Name    : xx_bom_import_pkg
Author's Name   : Krishanu Ghosh
Date Written    : 23-Feb-2007
RICEW Object id : BOM_CNV_01
Purpose         : Package Specification for BOM load
Program Style   :
Maintenance History:
Date:              Name                 Remarks
-----------        --------------       ------------------
17-Dec-2014       MadhuDhare       Initial version
--------------------------------------------------------------
*/
/*-----------------------------------------------------------
Public Constant Declaration Section
------------------------------------------------------------*/
  g_program_type       xx_emf_message_headers.program_type%TYPE
                                                               := 'CONC_PRGM';
/*-----------------------------------------------------------
Global Variable Declaration Section
-------------------------------------------------------------*/
  g_debug_level        NUMBER                                     := 50;
  -- 50 is default, that is all messages(logged at level 10,20..50)
  -- would be visible
  g_retention_period   NUMBER                                     := 30;
  -- This is the number of days for which error records are going
  -- to be retained in the EMF tables
  g_err_col1_width     NUMBER                                     := 10;
  g_err_col2_width     NUMBER                                     := 40;
  g_err_col3_width     NUMBER                                     := 10;
  g_err_col4_width     NUMBER                                     := 20;
  g_err_col5_width     NUMBER                                     := 20;
  g_err_col6_width     NUMBER                                     := 0;
  g_err_col7_width     NUMBER                                     := 0;
  g_err_col8_width     NUMBER                                     := 0;

  -- These 8 should add up to 100 for best display, you can use
  -- as many columns as you want, adding up to 100, leaving the rest as 0.

  /*-----------------------------------------------------------
  Public Procedure/Function Declaration Section
  Purpose-Main calling Procedure to Import Item Transaction
  -----------------------------------------------------------*/
  PROCEDURE main (
    p_errbuf     OUT      VARCHAR2
  , p_retcode    OUT      VARCHAR2
  , p_run_mode   IN       VARCHAR2
  );
END xx_bom_import_pkg;

/

-----------------------------------------------------------------------------------------
-- Sequence Name       : XX_BOM_IMPORT_STG_S
-- Author's name       : MadhuDhare
-- Date written        : 22-02-2014
-- RICEW Object id     : BOM_CNV_01
-- Description         : Sequence Script for record id of Staging Table
-- Program Style       :
--
-- Maintenance History :
--
-- Date         Issue# Name             Remarks
-- ----------- -------- ---------------------- ------------------------------------------
-- 23-02-2014           Madhu Dhare Initial version
------------------------------------------------------------------------------------------
DROP SEQUENCE xx_bom_import_stg_s
/

CREATE SEQUENCE xx_bom_import_stg_s
START WITH 1
INCREMENT BY 1
/
-------------------------------------------------------------------------------------------
-- Table Name          : XX_BOM_IMPORT_STG
-- Author's name       :Madhu Dhare
-- Date written        : 23-02-2014
-- RICEW Object id     : BOM_CNV_01
-- Description         : Table creation Script for staging table  
-- Program Style       : 
--
-- Maintenance History :
--
-- Date         Issue# Name             Remarks
-- ----------- -------- ---------------------- ------------------------------------------
-- 23-02-2014           MadhuDhare Initial version
------------------------------------------------------------------------------------------
DROP TABLE xx_bom_import_stg;

CREATE TABLE xx_bom_import_stg (
    status                      VARCHAR2(2)
  , record_id                   NUMBER   PRIMARY KEY
  , rec_type                    VARCHAR2(3)
  , record_count                NUMBER
  , org_code                    VARCHAR2 (3)
  , assembly_item_number        VARCHAR2 (40)
  , revision                    VARCHAR2 (3)
  , component_item_number       VARCHAR2 (40)
  , component_quantity          NUMBER
  , effectivity_date            DATE
  , assembly_type               NUMBER
  , process_flag                NUMBER
  , transaction_type            NUMBER
  , supply_subinventory         VARCHAR2(10)
  , supply_locator_id           NUMBER
  , location_name               VARCHAR2(100)
  , operation_seq_num           NUMBER
  , wip_supply_type             NUMBER
  , planning_factor             NUMBER
  , optional                    NUMBER
  , mutually_exclusive_options  NUMBER 
  , include_on_ship_docs        NUMBER
  , last_update_date            DATE
  , last_updated_by             NUMBER 
  , creation_date               DATE
  , created_by                  NUMBER
  , last_update_login           NUMBER
);

-------------------------------------------------------------------------------------------
-- Table Name          : XX_BOM_BILL_OF_MTLS_PREINT
-- Author's name       : Madhu Dhare
-- Date written        : 23-02-2014 
-- RICEW Object id     : BOM_CNV_01
-- Description         : Table creation Script for BOM Pre interface Header table  
-- Program Style       : 
--
-- Maintenance History :
--
-- Date         Issue# Name             Remarks
-- ----------- -------- ---------------------- ------------------------------------------
-- 23-02-2014           Madhu Dhare Initial version
------------------------------------------------------------------------------------------

DROP TABLE xx_bom_bill_of_mtls_preint;

CREATE TABLE xx_bom_bill_of_mtls_preint
(
  status                     VARCHAR2(2),
  bom_preint_id       NUMBER PRIMARY KEY,
  assembly_item_id           NUMBER,
  organization_id            NUMBER,
  alternate_bom_designator   VARCHAR2(10),
  last_update_date           DATE,
  last_updated_by            NUMBER,
  creation_date              DATE,
  created_by                 NUMBER,
  last_update_login          NUMBER,
  common_assembly_item_id    NUMBER,
  specific_assembly_comment  VARCHAR2(240),
  pending_from_ecn           VARCHAR2(10),
  attribute_category         VARCHAR2(30),
  attribute1                 VARCHAR2(150),
  attribute2                 VARCHAR2(150),
  attribute3                 VARCHAR2(150),
  attribute4                 VARCHAR2(150),
  attribute5                 VARCHAR2(150),
  attribute6                 VARCHAR2(150),
  attribute7                 VARCHAR2(150),
  attribute8                 VARCHAR2(150),
  attribute9                 VARCHAR2(150),
  attribute10                VARCHAR2(150),
  attribute11                VARCHAR2(150),
  attribute12                VARCHAR2(150),
  attribute13                VARCHAR2(150),
  attribute14                VARCHAR2(150),
  attribute15                VARCHAR2(150),
  assembly_type              NUMBER,
  common_bill_sequence_id    NUMBER,
  bill_sequence_id           NUMBER,
  request_id                 NUMBER,
  program_application_id     NUMBER,
  program_id                 NUMBER,
  program_update_date        DATE,
  demand_source_line         VARCHAR2(30),
  set_id                     VARCHAR2(10),
  common_organization_id     NUMBER,
  demand_source_type         NUMBER,
  demand_source_header_id    NUMBER,
  transaction_id             NUMBER,
  process_flag               NUMBER,
  organization_code          VARCHAR2(3),
  common_org_code            VARCHAR2(3),
  item_number                VARCHAR2(240),
  common_item_number         VARCHAR2(240),
  next_explode_date          DATE,
  revision                   VARCHAR2(3),
  transaction_type           VARCHAR2(10),
  delete_group_name          VARCHAR2(10),
  dg_description             VARCHAR2(240),
  original_system_reference  VARCHAR2(50),
  implementation_date        DATE
);

-------------------------------------------------------------------------------------------
-- Table Name          : XX_BOM_INVENTORY_COMPS_PREINT
-- Author's name       : Krishanu Ghosh
-- Date written        : 23-02-2014 
-- RICEW Object id     : BOM_CNV_01
-- Description         : Table creation Script for BOM Pre interface component details table  
-- Program Style       : 
--
-- Maintenance History :
--
-- Date         Issue# Name             Remarks
-- ----------- -------- ---------------------- ------------------------------------------
-- 23-02-2014           Madhu Dhare Initial version
------------------------------------------------------------------------------------------
DROP TABLE xx_bom_inv_comps_preint;

CREATE TABLE xx_bom_inv_comps_preint
(
  status                         VARCHAR2(2),
  bom_preint_id                  NUMBER,
  operation_seq_num              NUMBER,
  component_item_id              NUMBER,
  last_update_date               DATE,
  last_updated_by                NUMBER,
  creation_date                  DATE,
  created_by                     NUMBER,
  last_update_login              NUMBER,
  item_num                       NUMBER,
  component_quantity             NUMBER,
  component_yield_factor         NUMBER,
  component_remarks              VARCHAR2(240),
  effectivity_date               DATE,
  change_notice                  VARCHAR2(10),
  implementation_date            DATE,
  disable_date                   DATE,
  attribute_category             VARCHAR2(30),
  attribute1                     VARCHAR2(150),
  attribute2                     VARCHAR2(150),
  attribute3                     VARCHAR2(150),
  attribute4                     VARCHAR2(150),
  attribute5                     VARCHAR2(150),
  attribute6                     VARCHAR2(150),
  attribute7                     VARCHAR2(150),
  attribute8                     VARCHAR2(150),
  attribute9                     VARCHAR2(150),
  attribute10                    VARCHAR2(150),
  attribute11                    VARCHAR2(150),
  attribute12                    VARCHAR2(150),
  attribute13                    VARCHAR2(150),
  attribute14                    VARCHAR2(150),
  attribute15                    VARCHAR2(150),
  planning_factor                NUMBER,
  quantity_related               NUMBER,
  so_basis                       NUMBER,
  optional                       NUMBER,
  mutually_exclusive_options     NUMBER,
  include_in_cost_rollup         NUMBER,
  check_atp                      NUMBER,
  shipping_allowed               NUMBER,
  required_to_ship               NUMBER,
  required_for_revenue           NUMBER,
  include_on_ship_docs           NUMBER,
  low_quantity                   NUMBER,
  high_quantity                  NUMBER,
  acd_type                       NUMBER,
  old_component_sequence_id      NUMBER,
  component_sequence_id          NUMBER,
  bill_sequence_id               NUMBER,
  request_id                     NUMBER,
  program_application_id         NUMBER,
  program_id                     NUMBER,
  program_update_date            DATE,
  wip_supply_type                NUMBER,
  supply_subinventory            VARCHAR2(10),
  supply_locator_id              NUMBER,
  revised_item_sequence_id       NUMBER,
  model_comp_seq_id              NUMBER,
  assembly_item_id               NUMBER,
  alternate_bom_designator       VARCHAR2(10),
  organization_id                NUMBER,
  organization_code              VARCHAR2(3),
  component_item_number          VARCHAR2(240),
  assembly_item_number           VARCHAR2(240),
  revised_item_number            VARCHAR2(240),
  location_name                  VARCHAR2(81),
  reference_designator           VARCHAR2(15),
  substitute_comp_id             NUMBER,
  substitute_comp_number         VARCHAR2(240),
  transaction_id                 NUMBER,
  process_flag                   NUMBER,
  bom_item_type                  NUMBER,
  operation_lead_time_percent    NUMBER,
  cost_factor                    NUMBER,
  include_on_bill_docs           NUMBER,
  pick_components                NUMBER,
  ddf_context1                   VARCHAR2(30),
  ddf_context2                   VARCHAR2(30),
  new_operation_seq_num          NUMBER,
  old_operation_seq_num          NUMBER,
  new_effectivity_date           DATE,
  old_effectivity_date           DATE,
  assembly_type                  NUMBER,
  interface_entity_type          VARCHAR2(4),
  transaction_type               VARCHAR2(10),
  bom_inventory_comps_ifce_key   VARCHAR2(30),
  eng_revised_items_ifce_key     VARCHAR2(30),
  eng_changes_ifce_key           VARCHAR2(30),
  to_end_item_unit_number        VARCHAR2(30),
  from_end_item_unit_number      VARCHAR2(30),
  new_from_end_item_unit_number  VARCHAR2(30),
  delete_group_name              VARCHAR2(10),
  dg_description                 VARCHAR2(240),
  original_system_reference      VARCHAR2(50),
  enforce_int_requirements       VARCHAR2(80),
  optional_on_model              NUMBER,
  parent_bill_seq_id             NUMBER,
  plan_level                     NUMBER,
  auto_request_material          VARCHAR2(1),
  suggested_vendor_name          VARCHAR2(240),
  unit_price                     NUMBER,
  new_revised_item_revision      VARCHAR2(3)
);