Wednesday, 21 October 2015

Purchase order (PO) types



  • Standard Purchase order: This type of PO is used when you know the Item, Price, Delivery Schedule and payment terms. Most of the time Standard PO is used to fulfill sporadic demands or say demand coming once or twice a year. In this type of PO you are committing a purchase of item/s with particular quantity and particular price at particular shipment schedule.
For example
    • Purchasing for any specific event happening in Company
    • Where purchasing item/s is one time job.
  • Planned Purchase Order (PPO): This type of PO is used when you are not sure about the exact delivery schedules but other details are quite clear (like Item, Quantity, Price, approximate Delivery Schedule and Payment Term). For PPO Need-By-Date has to be entered, but this date will be treated as tentative date only. Once you are sure about the delivery schedule you create releases against this PPO with detailed delivery schedule. In this type of PO you are committing a purchase of item/s with particular quantity and particular price but with tentative shipment schedule. When you make a release, you are committing the delivery also.
For example
    • You need 1200 notebooks yearly, so you can raise PPO with quantity 1200 and in shipment details you can have shipment schedule as per your need (Say 12 shipments with 100 quantity each). This will be tentative schedule, you need to generate a release as and when you need the good and supplier will provide you material.
  • Blanket Purchase Order: This kind of PO is used when are not sure about quantity, price, delivery schedule. As soon as you select PO type as Blanket Purchase Agreement the fields for quantity  gets disabled. Blanket PO can be based on max agreed amount. Exact quantity Delivery Schedule and price will be informed to supplier by creating Blanket releases against blanket PO. You can have different ‘Price Breaks’ and specify the quantity / discount / effectively details. In this type of PO you are not committing your supplier at the time of creating PO, all the commitments are done when release is sent.
For Example:
    • A car manufacturer needs dashboard for each vehicle and it is purchased from selective suppliers only. But demand for dashboard is not clear. In this case Blanket PO is used and whenever demand comes, releases are sent to supplier.
  • Contract Purchase Order: This type of PO is used when you are not sure even about the item which need to be purchased J. The only information that you provide in a Contract PO is supplier, supplier site, payment terms and agreement control details (header part only). Standard PO are created by referring the Contract PO when some thing is to be purchased against the Contract PO from that supplier.
For example:
    • You need to import many items to run your business, but you don’t have Import/Export license. In this case you create Contract PO with supplier who has Import/Export license and whenever you need something to be imported, you generate standard PO referring the Contract PO for that Item/s.
Out of above 4 types you can add only Blanket and Contract POs in Approved Supplier List (ASL).

Thursday, 8 October 2015

Difference between truncate and delete command


Truncate verse Delete command in oracle

If you want to delete all the rows in a table, TRUNCATE TABLE is faster than DELETE.
DELETE physically removes rows one at a time and records each deleted row in the transaction log. TRUNCATE TABLE deallocates all pages associated with the table. For This reason, TRUNCATE TABLE is faster and requires less transaction log space than DELETE. TRUNCATE TABLE is functionally equivalent to DELETE with no WHERE clause, but TRUNCATE TABLE cannot be used with tables referenced by foreign keys. BOTH DELETE and TRUNCATE TABLE make the space occupied by the deleted rows available for the storage of new data.
 
Truncate just resets the high-water mark. It does not delete any rows. If you delete rows, then whatever you have specified regarding the referential integrity will be done (ON DELETE SET NULL, or ON DELETE  CASCADE, or the default which is to return ORA-02292 if the referential integrity constraint would be violated) whereas TRUNCATE just returns ORA-02266 if you have any enabled foreign key constraints referencing the  table, even if the tables are empty.

Schema : It is the schema to contain the trigger. If you omit schema, Oracle creates the trigger in your own schema.

TABLE : specifies the schema and name of the table to be truncated. you can truncate index-organized tables. This table cannot be part of a cluster.

When you truncate a table, Oracle also automatically deletes all data in the table's indexes.

SNAPSHOT LOG : specifies whether a snapshot log defined on the table to be preserved or purged when the table is truncated. This clause allows snapshot master tables to be reorganized through export/import without affecting the ability of primary-key snapshots defined on the master to be fast refreshed. To support continued fast refresh of primary-key snapshots the snapshot log must record primary-key information. For more information about snapshot logs and the TRUNCATE command, see Oracle8 Replication.

PRESERVE : - specifies that any snapshot log should be preserved when the master table is truncated.

PURGE : - specifies that any snapshot log should be purged when the master table is truncated.

CLUSTER : - specifies the schema and name of the cluster to be truncated. You can only truncate an indexed cluster, not a has cluster.

when you truncate a cluster, oracle also automatically deletes all data in the cluster's tables' indexes.

DROP STORAGE :- deallocates the space from the deleted rows from the table or cluster. This space can subsequently be used by other objects in the tablespace. This is the default. The DROP STORAGE option deallocates all but the space specified by the table's MINEXTENTS parameter.

RESUE STORAGE : retains the space from the deleted rows allocated to the table or cluster. Storage values are not reset to the values when the table or cluster was created. This space can subsequently be used only by new data in the table or cluster resulting from inserts or updates.

The DROP STORAGE and REUSE STORAGE options also apply to the space freed by the data deleted from associated indexes.

Deleting rows with the TRUNCATE command is also more convenient than dropping and re-creating a table because dropping and re-creating:

invalides the table's dependent objects, while truncating does not

requires you to regrant object privileges on the table, while truncating does not requires you to re-create the table's indexes, integrity constraints, and triggers and respecify its STORAGE parameters, while truncating does not

Note:

when you truncate a table, the storage parameter NEXT is changed to be the size of the last extent deleted from the segment in the process of truncation.

Restrictions

when you truncate a table,NEXT is automatically reset to the last extend deleted.

you cannot individually truncate a table that is part of a cluster. you must either truncate the cluster,delete all rows from the table,or drop and re-create the table.

You cannot truncate the parent table of an enabled referential integrity constraint. You must disable the constraint before truncating the table. (An exception is that you may truncate the table if the integrity constraint is self-referential.)

You cannot rollback a TRUNCATE statement.
 
 
Autonomous Transaction is a new feature in ORACLE. It allows setting up independent transactions that can be called from within other transactions. It lets you suspend the main transaction (without committing or rolling back), perform some DML operations, commit or rollback those operations (without any effect on the main transaction), and then return to the main transaction.
 
A pragma is a directive to the PL/SQL compiler. Pragmas pass information to the compiler, they are processed at compile time but do not execute.
 
A transaction is a Logical unit of work that compromises one or more SQL statements executed by a single User.
 
The SGA is a shared memory region allocated by the oracle that contains Data and control information for one oracle instance.
 

    P/L SQL Tables / Arrays

PL/SQL tables are declared in the declaration portion of the block. A table is a composite data type in PL/SQL. PL/SQL tables can have one column and a primary key neither of which can be named.
The column can be any scalar type but primary key should be a BINARY_INTEGER data type.
 
Rules for PL/SQL Tables:
1.  A loop must be used to insert values into a PL/SQL Table.
2. You cannot use the Delete command to delete the contents of PL/SQL Table. You must assign an empty table to the PL/SQL table being deleted.
 
2.  You cannot use the Delete command to delete the contents of PL/SQL

External Bank Import Process


Process of importing external bank account data in R12

Oracle supports many Open Interface Programs for importing data from any third party systems. For importing bank account information Oracle provides interface programs named ‘Customer Interface’ for importing Customer bank accounts and ‘Supplier Open Interface/Supplier site interface ’ for importing Supplier bank accounts.
This document helps in understanding the process of importing the external bank accounts data for customers or suppliers.

Importing Supplier bank accounts

The data to be imported is to be inserted in the interface tables first. After inserting the data in the interface tables,the ‘Supplier Open Interface Import’ program is run for inserting the data in the R12 tables.An important point to be noted with regard to the supplier bank accounts – the bank accounts data related to the suppliers can only be imported along with the supplier or supplier site. The bank account details cannot be imported individually. After creating the supplier or supplier site, the bank account can only be added from the user interface.
The supplier bank accounts can be assigned at the Supplier or Supplier Site or Address or Address Operating Unit level from the user interface. The import program supports assigning Supplier bank accounts at Supplier or at Supplier Site level only.
The main interface tables used for importing Suppliers, Supplier sites and Bank accounts data are as follows -
AP_SUPPLIERS_INT
IBY_TEMP_EXT_BANK_ACCTS.

AP_SUPPLIER_SITES_INT

The following scenarios are covered in this document –
a) Importing the bank account at Supplier level along with Supplier data
b) Importing the bank account at site level along with Supplier and Supplier site
i. Importing bank account at site along with supplier and site details.
ii. Importing bank account along with supplier site for an existing Supplier.
c) Importing the bank accounts for Employee type Supplier
The detailed steps for each of the scenarios have been mentioned below.
Importing the bank account at Supplier level along with Supplier data

Please follow the below mentioned steps for importing the bank account at supplier level.
Step 1 –
Insert the Suppliers data in the interface table AP_SUPPLIERS_INT.
Step 2 –
While inserting the data in the table AP_SUPPLIERS_INT, the data in the column
VENDOR_INTERFACE_ID should be generated sequentially. This is the unique identifier for
records in this table
The column AP_SUPPLIERS_INT.VENDOR_INTERFACE_ID is used to link the supplier with
the respective site or bank account details.
The sequence AP_SUPPLIERS_INT_S is used to generate the sequential number.
Step 3 –
The bank account details should be inserted in the interface table
IBY_TEMP_EXT_BANK_ACCTS
Step 4 –
While inserting the data in the table IBY_TEMP_EXT_BANK_ACCTS, as the bank account data is being assigned at supplier level, the column IBY_TEMP_EXT_BANK_ACCTS.CALLING_APP_UNIQUE_APP_REF1 should be updated
with the value from its corresponding suppliers
AP_SUPPLIERS_INT.VENDOR_INTERFACE_ID
Step 5 –
While inserting the data in IBY_TEMP_EXT_BANK_ACCTS and AP_SUPPLIERS_INT, the value for the column ‘Status’ should be updated as ‘NEW’ (case sensitive) in both the tables.After inserting the data in the tables AP_SUPPLIERS_INT and IBY_TEMP_EXT_BANK_ACCTS the data is ready to be imported.
Step 6 –
Navigate to the Payables >> Other: Requests >> Run -‘Submit Request’. The following screen is displayed.


Step 7 –
Select ‘Single Request’ and select ‘OK’ button.
concurrent program name : supplier open interface import
Step 8
In the request name, search and select the program with name ‘Supplier Open Interface
Step 9 –
Navigate to the parameters LOV and select the options based on the imported data.
Step 10 –
Parameters: Batch size indicates the number of records to be imported in one import program.
The default value is 1000 and can be modified.
Step 11 –
Parameters: Print exceptions only indicate whether the log file should contain only the exception
details. Default value is ‘No’ and can be modified to ‘Yes’.
Step 12 –
Parameters: Debug switch indicate whether the log file should contain the debug details. Default
value is ‘No’ and can be modified to ‘Yes’.
Step 13 –
Parameters: Trace switch indicate whether the trace file of the program should be generated.
Default value is ‘No’ and can be modified to ‘Yes’.
Step 14 –
Import options LOV: Default value is ‘All’. If the program is to import only the records with the
status ‘New’, select the option ‘New’. If the program is run to import only the rejected
transactions of the earlier run, select the option ‘Rejected’. If the request program is to import all
the records in the table, select the option ‘All’.

Step 15 –
Select ‘Submit’ button.
Step 16 –
The program ‘Supplier Open Interface Import’ automatically calls the ‘Create external bank
account’ (IBY_EXT_BANKACCT_PUB.CREATE_EXT_BANK_ACCT) program and imports
the bank accounts data related to the supplier.
On successful import of the records the column ‘Status’ will be updated from ‘NEW’ to
‘PROCESSED’. If a record is not imported due to any error, the field will be updated as
‘REJECTED’.
Step 17 –
To track the status of the request program, navigate to the ‘View requests’ screen
Step 18 –
When the Phase column shows ‘Completed’ and the status column shows ‘Normal’, select the
‘View Output’ button to know the number of records that have been imported.
Step 19 –
Select the ‘View Log’ button to go through the error messages if any.
After Successful import of Supplier/Supplier Site with the bank account details, following IBY Tables are
being populated.
IBY_EXTERNAL_PAYEES_ALL: A record is created in this table with Payee id (equivalent to
HZ_PARTIES.PARTY_ID).

IBY_EXT_BANK_ACCOUNTS: A record is inserted in this table with the bank account details
provided in IBY_TEMP_EXT_BANK_ACCTS.

IBY_PMT_INSTR_USES_ALL: For every external bank account created, a record is inserted in this
table. This table also holds relationship between External Payee and External Bank Account
Note:
2) While importing the bank account along with the supplier, if there is some error in the bank account
details, the supplier data will only be created without the bank details.
3) Bank account can be created without bank and branch details if the bank is not used for making
international payments. In other words bank account will be created without the bank and branch if
Bank_id and Branch_id is not inserted in IBY_TEMP_EXT_BANK_ACCTS table and
FOREIGN_PAYMENT_USE_FLAG is ‘No’.

Importing the bank account at site level along with Supplier and Supplier site

While importing the bank details for a supplier site, there are two scenarios –
a) Importing bank account at site along with supplier and site details.
b) Importing bank account along with supplier site for an existing Supplier.

Importing Bank account at site along with supplier and site details.

The additional interface table for storing the supplier sites data is AP_SUPPLIER_SITES_INT.
Step 1 –
Insert the data in the AP_SUPPLIERS_INT and AP_SUPPLIER_SITES_INT.
Step 2 –
While inserting the data in the table AP_SUPPLIERS_INT, the data in the column VENDOR_INTERFACE_ID should be generated sequentially. This is the unique identifier for records in this table In the scenario, VENDOR_INTERFACE_ID is used to link the supplier with the  respective site details
Step 3 –
While inserting data in the table AP_SUPPLIER_SITES_INT, the column AP_SUPPLIER_SITES_INT.VENDOR_INTERFACE_ID should be filled in with the
respective suppliers record value of the AP_SUPPLIER_INT.VENDOR_INTERFACE_ID
Step 4 –
Insert the bank account details in the interface table IBY_TEMP_EXT_BANK_ACCTS.
Step 5 –
As the bank account data is being assigned at supplier site level, while inserting the data in the table IBY_TEMP_EXT_BANK_ACCTS, the column IBY_TEMP_EXT_BANK_ACCTS.CALLING_APP_UNIQUE_APP_
REF2 should be updated with AP_SUPPLIER_SITES_INT.VENDOR_SITE_INTERFACE_ID.
VENDOR_SITE_INTERFACE_ID helps in linking the bank details with its corresponding Supplier site.
Step 6 –
While inserting the data in AP_SUPPLIERS_INT, AP_SUPPLIER_ SITES_INT and
IBY_TEMP_EXT_BANK_ACCTS, the value for the column ‘Status’ should be updated as ‘NEW’.
After inserting the data in the tables AP_SUPPLIERS_INT, AP_SUPPLIER_SITES_INT and IBY_TEMP_EXT_BANK_ACCTS the data is ready to be imported.
Step 7 –
Navigate to the Payables >> Other: Requests >> Run -‘Submit Request’ screen and run the program with name ‘Supplier Open Interface Import’.
The other steps to run the ‘Supplier Open Interface Import’ are same as explained for importing Bank accounts details at supplier level.

Importing bank account along with supplier site for an existing Supplier

The interface table for storing the supplier sites data is AP_SUPPLIER_SITES_INT and the bank account data is IBY_TEMP_EXT_BANK_ACCTS.
Step 1 –
Insert the data in the AP_SUPPLIER_SITES_INT.
Step 2 –
While inserting the data in the AP_SUPPLIER_SITES_INT, the column VENDOR_ID
should be updated with the respective supplier for which the supplier site is being created.
The column VENDOR_ID is used to link the supplier with the respective Supplier site details.
Step 3 –
The bank account details should be inserted in the interface table IBY_TEMP_EXT_BANK_ACCTS.
Step 4 –
As the bank account data is being assigned at supplier site level, while inserting the data  in the IBY_TEMP_EXT_BANK_ACCTS the column ‘CALLING_APP_UNIQUE_APP_REF2' should be updated with the respective  VENDOR_SITE_INTERFACE_ID.
The field AP_SUPPLIER_ SITES_INT is used to link the supplier site with the respective  bank account details.
Step 5 –
While inserting the data in AP_SUPPLIER_ SITES_INT and IBY_TEMP_EXT_BANK_ACCTS, the value for the column ‘Status’ should be updated as ‘NEW’.
After inserting the data in the tables AP_SUPPLIER_ SITES_INT and IBY_TEMP_EXT_BANK_ACCTS the data is ready to be imported.
Step 6 –
Navigate to the Payables >> Other: Requests >> Run -‘Submit Request’ screen and run
the program with name ‘Supplier Sites Open Interface Import’.
The other steps to run the ‘Supplier Open Interface Import’ are same as explained for importing Bank
accounts details at supplier level.
 Importing the bank accounts for Employee type Supplier

External bank account can be imported for Employee type suppliers while importing the supplier data for the employee.

Prerequisite


Employee record should have been created in the HR.

The interface tables for storing the supplier, supplier site and the bank account details remain the same - AP_SUPPLIER_SITES_INT, AP_SUPPLIER_SITES_INT and IBY_TEMP_EXT_BANK_ACCTS respectively.
Step 1 –
Insert the data in the AP_SUPPLIERS_INT.
Step 2 –
As the data is inserted for an employee type of supplier, the AP_SUPPLIER_INT.EMPLOYEE_ID should be updated with employee Id and VENDOR_TYPE_LOOKUP_CODE should be updated as ‘EMPLOYEE’.
Step 3 –
Insert the data in the AP_SUPPLIER_SITES_INT.
Step 4 –
As the data is imported for an employee type supplier, the AP_SUPPLIER_SITES_INT.VENDOR_SITE_CODE should be updated as ‘HOME’ or ‘OFFICE’ or ‘PROVISIONAL’ (please note that values are case sensitive and should be
given in capitals).
Step 5 –
Insert the bank account details in the interface table IBY_TEMP_EXT_BANK_ACCTS.
Step 6 –
As the bank account data is being assigned at supplier site level, while inserting the data in the table IBY_TEMP_EXT_BANK_ACCTS, the column IBY_TEMP_EXT_BANK_ACCTS.CALLING_APP_UNIQUE_APP_

REF2 should be updated with AP_SUPPLIER_SITES_INT.VENDOR_SITE_INTERFACE_ID.

VENDOR_SITE_INTERFACE_ID helps in linking the bank details with its
corresponding Supplier site.
Step 7 –
Navigate to the Payables >> Other: Requests >> Run -‘Submit Request’ screen and run the program with name ‘Supplier Open Interface Import’.
The other steps to run the ‘Supplier Open Interface Import’ are same as explained for importing Bank
accounts details at supplier level.

Normalization in oracle

Normalization / De-Normalization

Normalization: It's the process of efficiently organizing data in a database. There are two goals of the normalization process: eliminate redundant data ( for example, storing the same data in more than one table) and ensure data dependencies make sense (only storing related data in a table). Both of these are worthy goals as they reduce the amount of space a database consumes and ensure that data is logically stored.
Eliminat Repeating Groups - Make a separate table for each set of related attributes, and give each table a primary key.
Eliminate Redundant Data - If an attribute depends on only part of a multi-valued key, remove it to a separate table.
Eliminate Columns Not Dependent On Key - If attributes do not contribute to a description of the key, remove them to a separate table.
Isolate Independent Multiple Relationships - No table may contain two or more 1:n or n:m relationships that are not directly related.
Isolate Semantically Related Relationships - There many be practical constrains on information that justify separating logically related many-to-many relationships
1st Normal Form (1NF)
Def : A table (relation) is in 1NF if
    1. There are no duplicated rows in the table.
    2. Each cell is single-valued (i.e., there are no repeating groups or arrays).
    3. Entries in a column (attribute,field) are of the same kind.
      1. Note : The order of the rows is immaterial; the order of the columns is immaterial.
        Note: The requirement that there be no duplicated rows in the table means that the table has a key (although the key might be made up of more than one column - even, possibly, of all the columns).
        2nd Normal Form (2NF)
        Def: A table is in 2NF if it is in 1NF and if all non-key attributes are dependent on all of the key.
        Note : Since a partial dependency occurs when a non-key is dependent on only a part of the (composite) key, the definition of 2NF is sometimes phrased as, "A table is in 2NF if it is in 1NF and if it has no partial dependencies."
        3rd Normal Form (3NF)
        Def: A table is in 3NF if it is in 2NF and if it has no transitive dependencies.
        Boyce-Codd Normal Form (BCNF)
        Def: A table is in BCNF if it is in 3NF and if every determinant is a candidate key.
        4th Normal Form (4NF)
        Def: A table is in 4NF if it is in BCNF and if it has no multi-valued dependencies.
        5th Normal Form (5NF)
        Def: A table is in 5NF, also called "Project-Join Normal Form" (PJNF), if it is in 4NF and if every join dependency in the table is a consequence of the candidate keys of the table.
        Domain-Key Normal Form (DKNF)
        Def: A table is in DKNF if every constraint on the table is a logical consequence of the definition of keys and domains.

        De-Normalization :
        Denormalization is a technique to move from higher to lower normal forms of database modeling in order to speed up database access. you may apply Denormalization in the process of deriving a physical data model from a logical form.

      AME Setup

       

      Steps for AP Invoice Approval AME setup


      Step 1: Navigation to Profile options
      System Administrator Ã Profile Ã  system
      Setup 2 :  Enter Application and Profile details and Press Find Button.
       

      Step 3 : Change the AME Installed Value to YES as shown below
       
      Step 4 : Change to Payables Responsibilty and  Navigate to Payables Options

       
       
      
      
      Step 5 : Enter the Operating Unit Name.
      Step 6 :  Navigate to Approval Tab and Enable  ‘Use Invoice Approval Workflow ‘ as shown below
       
      Step 7: Switch to Approvals  Management Business Analyst Responsibility .
       
       Step 8 :  Enter the Transaction  Type as  ‘ Payables Invoice Approval 
       
      Step 9: Press the Approval Groups Button as shown above Screen shot.
      Create the Approval Group with the Below Values
      In the Query I have written the function which will return the Accounting Manager in the Test instance.
      
      
      Step 10: Navigate to Action Types  Button.
      And select Action type as Pre Chain of Authority Approvals as shown below
       
      You will get the Action value as ‘Require pre-approval from OSD Account Manager Approval

      Step 11 : Create a Rule by following below Steps ,
      a)      Enter the Name of the Rule  Example :  osd Approval Management Approval,Rule  type : Combination : List Creation, Item Class : Header as shownbelow
      a)      As there are no Conditions , press the next button.
      b)      Select the Action Type as ‘Pre Chain of Authority Approvals’  and Action as ‘pre-approval from OSD Account Manager Approval’ .
      Step 4 : Finish 
      Completion of AME Setup
      Step 12 : Navigate to Payables Manager
      Create An invoice by Entering the Header and line Information.

      Entering the Line Information.
       
       
       

      Now By Pressing  the Distribution  Button.
      Enter the Distribution Level details as shown below  screen shot.
       
      Once the Account is Generated.
      àNavigate to Invoice page Actions .
      Enable the Check box Validate and press OK button
       
      
      Create the Account by Enabling the Create Accounting check box and   Final and press OK   from the Above Screen.
      Once the Account is Generated Run the ‘Invoice Approval Workflow’  .
      Navigation : view Ã  Requests
      Parameters :
      Supplier Name ,Invoice Num .
       
      Once the Program complete successfully, follow the below steps
      Navigate : Reports Ã  View Invoice  Approval History
      You will get the Account Manager  details for the Invoice  and the notification will be sent to the Approver.
      CREATE OR REPLACE FUNCTION XX_GET_APPROVER( p_invoice_id IN NUMBER )
          RETURN VARCHAR
        IS
          l_person_id      NUMBER        := 0 ;
          l_count          NUMBER        := 0;
          V_OPERATING_UNIT VARCHAR2(2000):=NULL;
          V_ORG_ID         NUMBER        := 0;
          l_return_val     VARCHAR2(200) := NULL;
        BEGIN
          BEGIN
            SELECT COUNT(*)
           INTO l_count
            FROM ap_invoices_all ail,
              ap_suppliers aps
              --    po_lookup_codes plc
            Where Ail.Vendor_Id              = Aps.Vendor_Id
            And NVL(Aps.Vendor_Type_Lookup_Code,'XYZ') <>'OUTSOURCING'
      --      AND aps.vendor_type_lookup_code <>'OUTSOURCING'   
              -- and aps.vendor_type_lookup_code = plc.lookup_code
            AND ail.invoice_type_lookup_code IN ('PREPAYMENT', 'STANDARD','MIXED')
            AND ail.invoice_id                = p_invoice_id;
            --   and plc.lookup_type <> 'VENDOR TYPE' ;
          EXCEPTION
          WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Invoice does not exist :');
          END;
          DBMS_OUTPUT.PUT_LINE('Invoice does not exist l_count :'||l_count);
          IF l_count >= 1 THEN
            BEGIN
              SELECT org_id
              INTO V_ORG_ID
              FROM ap_invoices_ALL
              WHERE invoice_id=p_invoice_id;
            EXCEPTION
            WHEN OTHERS THEN
              DBMS_OUTPUT.PUT_LINE('Invoice orgid does not exist :');
            END;
            DBMS_OUTPUT.PUT_LINE('Org id Value :'||v_org_id);
            BEGIN
              SELECT name
              INTO V_OPERATING_UNIT
              FROM hr_operating_units
              WHERE organization_id=v_org_id;
            EXCEPTION
            WHEN OTHERS THEN
              DBMS_OUTPUT.PUT_LINE('operating unit does not exist :');
            END;
            DBMS_OUTPUT.PUT_LINE('Org id Value :'||V_OPERATING_UNIT);
            BEGIN
              IF v_operating_unit LIKE 'operations' THEN
                SELECT paf1.person_id
                INTO l_person_id
                FROM HR_ALL_POSITIONS_F HAPF,
                  PER_JOBS PJB ,
                  PER_ALL_PEOPLE_F PAF1,
                  FND_USER FU ,
                  PER_ALL_ASSIGNMENTS_F PAAF
                WHERE SUBSTR(HAPF.name,INSTR(HAPF.name,'.',1)+1,15)='Account Manager'
                AND PJB.NAME                                       ='Manager'
                AND PAAF.PERSON_ID                                 =PAF1.PERSON_ID
                AND HAPF.JOB_ID                                    = PJB.JOB_ID
                AND PAAF.JOB_ID                                    =PJB.JOB_ID
                AND PAAF.POSITION_ID                               =HAPF.POSITION_ID
                AND (sysdate BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE)
                AND (sysdate BETWEEN paf1.effective_start_date AND paf1.effective_end_date)
                AND PAAF.JOB_ID            =HAPF.JOB_ID
                AND FU.EMPLOYEE_ID         =PAF1.PERSON_ID
                AND rownum                 =1
                AND SUBSTR(HAPF.name,1,2) IN
                  (SELECT FLEX_VALUE
                  FROM FND_FLEX_VALUE_SETS FFVS,
                    FND_FLEX_VALUES FFV ,
                    FND_FLEX_VALUES_TL FFVT
                  WHERE FFVS.FLEX_VALUE_SET_ID=FFV.FLEX_VALUE_SET_ID
                  AND FFV.FLEX_VALUE_ID       =FFVT.FLEX_VALUE_ID
                  AND FFVT.LANGUAGE           ='US'
                  AND FLEX_VALUE_SET_NAME     ='operations_Company'
                  AND FFVT.DESCRIPTION        ='Operations'
                  );
              elsif v_operating_unit='glass' THEN
                SELECT paf1.person_id
                INTO l_person_id
                FROM HR_ALL_POSITIONS_F HAPF,
                  PER_JOBS PJB ,
                  PER_ALL_PEOPLE_F PAF1,
                  FND_USER FU ,
                  PER_ALL_ASSIGNMENTS_F PAAF
                WHERE SUBSTR(HAPF.name,INSTR(HAPF.name,'.',1)+1,15)='Account Manager'
                AND PJB.NAME                                       ='Accountant' --'Manager'
                AND PAAF.PERSON_ID                                 =PAF1.PERSON_ID
                AND HAPF.JOB_ID                                    = PJB.JOB_ID
                AND PAAF.JOB_ID                                    =PJB.JOB_ID
                AND PAAF.POSITION_ID                               =HAPF.POSITION_ID
                AND (sysdate BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE)
                AND (sysdate BETWEEN paf1.effective_start_date AND paf1.effective_end_date)
                AND PAAF.JOB_ID            =HAPF.JOB_ID
                AND FU.EMPLOYEE_ID         =PAF1.PERSON_ID
                AND rownum                 =1
                AND SUBSTR(HAPF.name,1,2) IN
                  (SELECT FLEX_VALUE
                  FROM FND_FLEX_VALUE_SETS FFVS,
                    FND_FLEX_VALUES FFV ,
                    FND_FLEX_VALUES_TL FFVT
                  WHERE FFVS.FLEX_VALUE_SET_ID=FFV.FLEX_VALUE_SET_ID
                  AND FFV.FLEX_VALUE_ID       =FFVT.FLEX_VALUE_ID
                  AND FFVT.LANGUAGE           ='US'
                  AND FLEX_VALUE_SET_NAME     ='Company'
                  AND FFVT.DESCRIPTION        ='glass'
                  );
              Elsif v_operating_unit LIKE 'suretech' THEN
                SELECT paf1.person_id
                INTO l_person_id
                FROM HR_ALL_POSITIONS_F HAPF,
                  PER_JOBS PJB ,
                  PER_ALL_PEOPLE_F PAF1,
                  FND_USER FU ,
                  PER_ALL_ASSIGNMENTS_F PAAF
                WHERE SUBSTR(HAPF.name,INSTR(HAPF.name,'.',1)+1,15)='Account Manager'
                AND PJB.NAME                                       ='Manager'
                AND PAAF.PERSON_ID                                 =PAF1.PERSON_ID
                AND HAPF.JOB_ID                                    = PJB.JOB_ID
                AND PAAF.JOB_ID                                    =PJB.JOB_ID
                AND PAAF.POSITION_ID                               =HAPF.POSITION_ID
                AND (sysdate BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE)
                AND (sysdate BETWEEN paf1.effective_start_date AND paf1.effective_end_date)
                AND PAAF.JOB_ID            =HAPF.JOB_ID
                AND FU.EMPLOYEE_ID         =PAF1.PERSON_ID
                AND rownum                 =1
                AND SUBSTR(HAPF.name,1,2) IN
                  (SELECT FLEX_VALUE
                  FROM FND_FLEX_VALUE_SETS FFVS,
                    FND_FLEX_VALUES FFV ,
                    FND_FLEX_VALUES_TL FFVT
                  WHERE FFVS.FLEX_VALUE_SET_ID=FFV.FLEX_VALUE_SET_ID
                  AND FFV.FLEX_VALUE_ID       =FFVT.FLEX_VALUE_ID
                  AND FFVT.LANGUAGE           ='US'
                  AND FLEX_VALUE_SET_NAME     ='child_Company'
                  And Ffvt.Description        ='child'
                  ); 
              Elsif v_operating_unit='master' THEN
                SELECT paf1.person_id
                INTO l_person_id
                FROM HR_ALL_POSITIONS_F HAPF,
                  PER_JOBS PJB ,
                  PER_ALL_PEOPLE_F PAF1,
                  FND_USER FU ,
                  PER_ALL_ASSIGNMENTS_F PAAF
                WHERE SUBSTR(HAPF.name,INSTR(HAPF.name,'.',1)+1,15)='Account Manager'
                AND PJB.NAME                                       ='Manager'
                AND PAAF.PERSON_ID                                 =PAF1.PERSON_ID
                AND HAPF.JOB_ID                                    = PJB.JOB_ID
                AND PAAF.JOB_ID                                    =PJB.JOB_ID
                AND PAAF.POSITION_ID                               =HAPF.POSITION_ID
                AND (sysdate BETWEEN PAAF.EFFECTIVE_START_DATE AND PAAF.EFFECTIVE_END_DATE)
                AND (sysdate BETWEEN paf1.effective_start_date AND paf1.effective_end_date)
                AND PAAF.JOB_ID            =HAPF.JOB_ID
                AND FU.EMPLOYEE_ID         =PAF1.PERSON_ID
                AND rownum                 =1
                AND SUBSTR(HAPF.name,1,2) IN
                  (SELECT FLEX_VALUE
                  FROM FND_FLEX_VALUE_SETS FFVS,
                    FND_FLEX_VALUES FFV ,
                    FND_FLEX_VALUES_TL FFVT
                  WHERE FFVS.FLEX_VALUE_SET_ID=FFV.FLEX_VALUE_SET_ID
                  AND FFV.FLEX_VALUE_ID       =FFVT.FLEX_VALUE_ID
                  AND FFVT.LANGUAGE           ='US'
                  AND FLEX_VALUE_SET_NAME     ='master_Company'
                  AND FFVT.DESCRIPTION        ='master'
                  );
              ELSE
                l_person_id:=0;
              END IF;
            EXCEPTION
            WHEN OTHERS THEN
              l_person_id :=0;
            END;
            DBMS_OUTPUT.PUT_LINE('person id Value :'||l_person_id);
          ELSE
            l_person_id :=0;
          END IF;
          DBMS_OUTPUT.PUT_LINE('Invoice does not exist l_person_id :'||l_person_id);
          l_return_val := 'person_id:' ||TO_CHAR(l_person_id);
          RETURN (l_return_val);
        EXCEPTION
        WHEN OTHERS THEN
          l_person_id :=0;
          Return (L_Return_Val);
        End XX_Get_Approver;