Extensibility for Implementers

Creating Modifications Using a Procedure

To modify awards created through PDOI or CLM interface, use the "PO_PDOI_MOD_PVT.create_award_mod" procedure. This API is applicable only to quantity-based lines.

Use the procedure to modify the following components of an award:

  1. Update UDA attributes.

  2. Change quantity, price, and fund values regardless of whether the award line is open or closed.

  3. Update goods-based CLINs.

The following restrictions apply to the procedure:

  1. New lines cannot be added to a modification.

  2. Awards that refer to a backing requisition cannot be modified.

  3. Charge account changes cannot be made.

Prerequisites

Before you run the procedure, ensure that the following steps are complete.

  1. Create a SQL script to trigger the procedure. The sample script is available at the end of this topic.

  2. Populate the PDOI interface tables with header, line, schedule, distribution, and UDA attributes data so that the procedure can process data to create modification and also launch automatic approval to deobligate funds.

  3. Ensure that the award is in the Approved status. Awards in the status such as Closeout Process or Closeout are not processed.

  4. Draft or In Process modification should not exist for the award that you want to process.

  5. Make sure that the GL data is in the Open purchasing or GL period. If the profile PO_VALIDATE_GL_PERIOD is set to R, then the date will be defaulted as sysdate if the current date is in the closed period.

Details to Run the Procedure

Documentation for creating modifications is available as comments in the file: PO_PDOI_MOD_PVT.plb.

Location of the files:

$PO_TOP/patch/115/sql/PO_PDOI_MOD_PVT.pls

$PO_TOP/patch/115/sql/PO_PDOI_MOD_PVT.plb

These procedures are always enabled, requiring no profile option to enable them.

Sample SQL Script to Trigger the Procedure

set serveroutput on;
DECLARE
l_batch_id  NUMBER;
x_return_status VARCHAR2(1);
l_document_number VARCHAR2(30):='PST-DOC23-A-0172';
BEGIN
l_batch_id:= po_headers_interface_s.NEXTVAL;
DBMS_output.put_line(l_batch_id);
/*======================  Insert into po_headers_interface ===============================================*/
INSERT INTO po_headers_interface
            (
                        interface_header_id,
                        batch_id,
                        process_code,
                        action,
                        document_type_code,
                        org_id,
                        po_header_id,
                        document_num
            )
            VALUES
            (
                        po_headers_interface_s.NEXTVAL,
                        l_batch_id,
                        'PENDING',
                        'UPDATE',
                        'CLM_MOD',
                        1885,
                        439461,
                        l_document_number
            );
 /* Mandatory Header level UDA attributes for Mod creation */
 INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        ATTR_GROUP_ID,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        1982,
                        'PO_HEADER_EXT_ATTRS',
                        'mod_Just',
                        1,
                        'mod_auth',
                        'OTHER_AUTHORITY',
                        po_uda_interface_row_id_s.NEXTVAL,
                        'PO_HEADER'
            );
 /* Mandatory Header level UDA attributes for Mod creation */



            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        ATTR_GROUP_ID,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        1982,
                        'PO_HEADER_EXT_ATTRS',
                        'mod_Just',
                        1,
                        'justifiction',
                        'Deobligation of funds Demo',
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );
                        
                         /* Set document numbering attributes */

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_AWD_MOD',
                        1,
                        'DELIMITER',
                        '-',
                        po_uda_interface_row_id_s.NEXTVAL,
                        'PO_HEADER'
            );

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_AWD_MOD',
                        1,
                        'MODIF_TYPE',
                        'ACO',
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_ORD_MOD',
                        1,
                        'BASE_DOC_NUM',
                        l_document_number,
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_AWD_MOD',
                        1,
                        'CONTROL_CHAR',
                        'C',
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_AWD_MOD',
                        1,
                        'SERIAL_NUMBER',
                        '0001',
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );

            INSERT INTO po_uda_interface
            (
                        interface_reference_id ,
                        interface_line_id,
                        attr_group_app_id,
                        attr_group_type ,
                        attr_group_name ,
                        process_status,
                        attr_name,
                        attr_value_str,
                        row_identifier,
                        data_level_1
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_uda_interface_s.NEXTVAL,
                        201,
                        'PO_HEADER_EXT_ATTRS',
                        'DOD_AWD_MOD',
                        1,
                        'MODIF_CODE',
                        '0',
                        po_uda_interface_row_id_s.CURRVAL,
                        'PO_HEADER'
            );

 /* Set document numbering attributes */

   /*======================  Insert into po_lines_interface ===============================================*/
            INSERT INTO po_lines_interface
            (
                        interface_line_id,
                        interface_header_id,
                        quantity,
                        po_line_id,
                        line_num_display
            )
            VALUES
            (
                        po_lines_interface_s.NEXTVAL,  --- INTERFACE_LINE_ID,
                        po_headers_interface_s.CURRVAL,--- INTERFACE_HEADER_ID,
                        8,
                        507028,
                        '0001'
            );
/*====================== Insert into po_line_locations_interface ===============================================*/
         INSERT INTO po_line_locations_interface
            (
                        interface_line_location_id,
                        interface_header_id,
                        interface_line_id,
                        quantity,
                        line_location_id,
                                                                                                shipment_type,
                        shipment_num
            )
            VALUES
            (
                        po_line_locations_interface_s.NEXTVAL,
                        po_headers_interface_s.CURRVAL,
                        po_lines_interface_s.CURRVAL,
                        8,
                        571010,
                                                                                                'STANDARD',
                        1
            );
/*======================  Insert into po_distributions_interface ===============================================*/
         INSERT INTO po_distributions_interface
            (
                        interface_header_id,
                        interface_line_id,
                        interface_line_location_id,
                        interface_distribution_id,
                        quantity_ordered
                        ,po_distribution_id
                        ,gl_encumbered_date
                        ,distribution_num
            )
            VALUES
            (
                        po_headers_interface_s.CURRVAL,
                        po_lines_interface_s.CURRVAL,
                        po_line_locations_interface_s.CURRVAL,
                        po.po_distributions_interface_s.NEXTVAL,
                        8
                        ,573088
                        ,sysdate-1
                        ,1
            );
 COMMIT;
 -- APPS context Initialize
 fnd_global.APPS_INITIALIZE (1003399,68677,201);
 DBMS_output.put_line('po_headers_interface_s.CURRVAL '||po_headers_interface_s.CURRVAL);
 -- calling MOD API
 PO_PDOI_MOD_PVT.create_award_mod(
                     p_calling_module => 'MOD_API'
                     ,p_batch_id => l_batch_id
                    ,p_interface_header_id => po_headers_interface_s.CURRVAL
                    ,x_return_status => x_return_status
                    );
  EXCEPTION
  WHEN OTHERS THEN
  Dbms_Output.put_line('Exception '||SQLCODE||' '||sqlerrm);
  END;

Customizing Document Submission Checks

You can extend document submission checks by using the following custom hooks:

These custom hooks for document submission checks are applicable to the following CLM documents:

The documentation on how to code these submission checks is available as comments in the files PO_CUSTOM_SUBMISSION_CHECK_PVT.plb and PO_CUSTOM_SUBMISSION_CHECK_PVT.pls.

Location of the files:

$PO_TOP/patch/115/sql/PO_CUSTOM_SUBMISSION_CHECK_PVT.plb

$PO_TOP/patch/115/sql/PO_CUSTOM_SUBMISSION_CHECK_PVT.pls

The packages are always enabled, requiring no profile options to enable them.

Customizing Funds Check

You can extend the funds check function by using the following custom hook:

Procedure for custom funds check : PO_CUSTOM_FUNDS_PKG.do_action (Fired after the standard Oracle Funds Check and overrides the results of the standard Funds Check.)

This custom hook for Funds Check is applicable to the following CLM documents:

The documentation on how to code the Funds Check is available as comments in the files PO_CUSTOM_FUNDS_PKG.plb and PO_CUSTOM_FUNDS_PKG.pls.

Location of the files:

$PO_TOP/patch/115/sql/PO_CUSTOM_FUNDS_PKG.pls

$PO_TOP/patch/115/sql/PO_CUSTOM_FUNDS_PKG.plb

The packages are always enabled, requiring no profile option to enable them.

Customizing the Print Function

Printing documents such as Awards, solicitations and IDVs involves the following steps:

  1. Generating XML and extracting the required information from underlying tables using the BI Publisher data templates.

  2. Designing the layout and creating appropriate mapping to XML elements using BI Publisher PDF and RTF templates.

Review both data and printing layout templates to obtain the required PDF. Use the concurrent program Generate XML for CLM documents to generate XML for a given document. Review the output to verify if the data required is already part of the XML. If not, you are required to customize the data definition. In order to customize the printing layouts, you need to review the PDF templates which are the standard forms or face pages and the RTF templates which are the continuation pages or document format. Refer to the Oracle Business Intelligence Publisher Report Designer's Guide (Appendix B) that lists the template code for each predefined form and continuation pages.

With some standard forms related to Award, there is a requirement to include certain FAR clauses as the print output or not. This depends on how clauses will be modeled, therefore a custom hook is provided where the logic can be written during implementation.

The Package is: PO_DT_CUSTOM_PKG and the function is: FUNCTION get_clause_number(p_header_id NUMBER ) RETURN VARCHAR2;

This function is used to check whether the specified FAR clauses are present as part of the given header id. It returns Y if clauses are present or N if specific clauses are not present.

PO_DT_CUSTOM_PKG

Implementation must be provided for the following custom package: PO_DT_CUSTOM_PKG. The following methods have been added for this package:

Location of the files are: $PO_TOP/patch/115/sql/PO_DT_CUST.pls and $PO_TOP/patch/115/sql/PO_DT_CUST.plb

The packages are always enabled, requiring no profile options to enable them.

PON_DT_CUSTOM_PKG

Implementation must be provided for the following custom package: PON_DT_CUSTOM_PKG. The following methods have been added for this package:

Location of the files are: $PON_TOP/patch/115/sql/PON_DT_CUST.pls and $PON_TOP/patch/115/sql/PON_DT_CUST.plb

The packages are always enabled, requiring no profile options to enable them.

Extending the Workload Assignment Feature

See Workload Assignment Setup Steps and Workload Assignments Overview, Oracle Contract Lifecycle Management for Public Sector Purchasing User Guide.

Generating Assignment Number

The custom hook 'po_palt_assignments_hook.AssignmentNumberCustHook' is provided as part of the files POPTASHS.pls (package Specification) and POPTASHB.pls (package Body). The custom hook uses Requisition Line IDs as input and returns the Assignment Number. The Assignment Number is used in the Buyer Work Center, when requisition lines are assigned to a workload assignment. Note that you can implement your own code to generate the Assignment Number.

Computing Milestone Completion Date for Assignment

The other custom hooks that are used as part of the concurrent request Compute Milestones Completion Date for Assignment are listed below. They are provided as part of the files POPTMCHS.pls (package Specification) and POPTMCHB.pls (package Body). Implementers can customize the logic to derive the dates for these milestones based on their requirements.These API's take Assignment Number as input and return the relevant date:

The above mentioned package can be extended to compute the completion date for user defined milestones.

Extending the Pre-Filled Information for FPDS-NG reporting

For FPDS-NG reporting, the pre-filled XML payload contains only minimum required information for creating and updating the CAR.

To extend the Pre-Filled Information for FPDS-NG reporting, perform the following steps:

Modify the Data Source

  1. The BI Publisher data template forms the XML source. The following are the predefined data definition used to generate the XML payload.

    Data Definition Code Name
    POAWDFPDSNG Award Data Template for FPDS-NG
    POIDVFPDSNG IDV Data Template for FPDS-NG
    POAWDMODFPDSNG Award Mod Data Template for FPDS-NG
    POIDVMODFPDSNG IDV Mod Data Template for FPDS-NG
  2. Using the XML Publisher Administrator responsibility > Data Definitions, search for the above definitions using the code mentioned. Download the required definition file.

  3. Modify the data template to include fields required. For more information on how to edit a data template, refer to the Oracle XML Publisher Administration and Developer's Guide.

  4. Create a new custom data definition using XML Publisher Administrator responsibility > Data Definition and upload the modified file.

  5. The custom definition must be specified in the following profiles so that the XML generation process picks the new definition file:

    Profile Name Data Definition Name
    PO: FPDS-NG Award XML Source Award Data Template for FPDS-NG
    PO: FPDS-NG IDV XML Source IDV Data Template for FPDS-NG
    PO: FPDS-NG Award Mod XML Source Award Mod Data Template for FPDS-NG
    PO: FPDS-NG IDV Mod XML Source IDV Mod Data Template for FPDS-NG

Modify the XML payload XSLT

  1. The XML generated from the data template is then transformed to the payload XML required by FPDS-NG. You can locate the following XSLT in the $OA_HTML folder.

    XSLT File Name Applicable Document
    POAWDFPDSNG.xsl Award XML
    POAWDMODFPDSNG.xsl Award Mod XML
    POIDVFPDSNG.xsl IDV XML
    POIDVMODFPDSNG.xsl IDV Mod XML
  2. Modify this file to include the elements of interest. This is an XSLT file to select the appropriate nodes from the source XML.

  3. This will include the newly added elements to FPDS payload XML with the appropriate namespace. This becomes the source for rendering the pre-fill information.

Modify the XSL template to render the pre-fill

  1. The pre-fill information is rendered using BI Publisher XSL-HTML templates. The following are the predefined template definitions:

    Template Code Name
    POAWDPREFIL Award Pre-fill
    POIDVPREFIL IDV Pre-fill
  2. Using the XML Publisher Administrator responsibility > Templates, search for the above templates using the code mentioned. Download the definition file.

  3. This is an XSL stylesheet that will apply to the XML to render the content. Include the columns of interest from the XML payload. For more information on how to edit template files refer to the Oracle XML Publisher Administration and Developer's Guide.

  4. Upload the modified file to the application using the same responsibility under the appropriate template code.

Customizing Contract Clause Sorting

The CLM patch contains the procedure sort_clauses in the package OKC_CODE_HOOK, which has sample logic to sort the clauses based on the clause number. The ordering is started every time the user clicks on the Sort button in the Contract Terms Structure page. This button is displayed only when the profile option OKC: Enable Clause Sorting is set to Yes.

Sample sorting logic

The FAR clauses are usually numbered as follows:

<number1>.<number2>-<number3><space>[ALT<space><roman numeral> or (DEV)]. Some examples are:

CLM clause numbers are required to be numbered as per FAR clause numbering rules, hence the clauses are sorted in ascending order first by <number1> part, second by <number2> part, third by <number3> part and then by <roman numeral> part of the clause numbers.

Implementation Considerations

Customizing the Contracts Function

OKC_CODE_HOOK.IS_NOT_PROVISIONAL_SECTION is the code hook that can be leveraged to exclude provisional sections flowing down from solicitation to award document.

PACKAGE: okc_code_hook (found in file $OKC_TOP/patch/115/sql/OKCCCHKB.pls).

SIGNATURE:

FUNCTION is_not_provisional_section (
                     p_section_heading   IN VARCHAR2,
                     p_source_doc_type   IN  VARCHAR2 default null,
                     p_source_doc_id     IN NUMBER default null)
                     RETURN VARCHAR2;

INPUT PARAMETERS:

p_section_heading:  Section Name
p_source_doc_type:  Source Document Type, possible values are 'AUCTION_RESPONSE', 'RFI_RESPONSE', 'RFQ_RESPONSE' and 'SOLICITATION_RESPONSE'
p_source_doc_id:  Source Document Id    

RETURN VALUE:

True, if not a provisional section. False, if a provisional section.

USAGE: When copying terms from awarded bid/quote document to target purchasing documents (Purchase Order, Agreements, Award, IDV) this routine can be used to identify a certain set of sections as provisional and prevent them from being copied to the target document. Clauses under this section are also dropped along with the section. In this method, custom logic can be written to identify a section as provisional or not based on the setup. As an example, in CLM, when converting a solicitation response or an offer into an Award, there is a need to drop provisional sections on the Award document. The sections need to be identified as provisional based on the document format attribute on the solicitation document. The following code snippet explains further.

/*Determine document format attribute of solicitation based on the source document which is bid/quote
if p_source_doc_type='SOLICITATION_RESPONSE' then
                select document_format into l_doc_format
                from pon_auction_headers_all
                where auction_header_id =(select auction_header_id
                                          from pon_bid_headers
                                          where bid_number=p_source_doc_id);
end if;
/* Identify section for dropping based on the document format value
if (l_doc_format='UCF') then
                if(p_section_heading = 'Section J')                                 return false; //Note Return false in case of provisional section.
                end if; 
end if;         "

Related Topics

Contract Clause and Rules Import API

A set of APIs has been provided to assist implementers import Contract Clauses, Templates, Questions, Constants and Rules. For more details on the APIs, refer to the relevant My Oracle Support notes.

Contract Clause Migration API

A set of APIs has been provided to help implementers migrate contract clauses that are in a procurement document. For more details on the APIs, refer to the relevant My Oracle Support notes.

Document Numbering for Acquisition Plan and SBCR

The Acquisition Plan Summary and Small Business Coordination Record documents can be numbered in various ways. The numbering of these documents depends on the value of the profile option Contract Repository Auto-Numbering Enabled. The profile option, set at site level, decides whether the document number is system defined or manual.

The following table outlines the numbering methods based on the value of the profile option.

Contract Repository Auto-Numbering Enabled profile option value Numbering Method 1 Numbering Method 2
Yes Custom Hook Sequence (used during manual authoring and contract import)
No Manual Numbering (used during contract import) Descriptive Flexfields

Custom Hook

The custom hook (okc_rep_num_hook.get_rep_contract_number) is used for contract numbering. The custom logic to generate contract numbers are defined in this API. FUNCTION get_rep_contract_number The function is used to derive custom contract numbers for Small Business Coordination Record (SBCR) and Acquisition Plan documents.

Sequence

The Sequence OKC_REP_CONTRACTS_ALL_S2 is used to generate sequences for the contract number. The contract number is unique across Contract Type, Operating Unit, that is, the same contract number does not repeat across Operating Units/Contract Types. The most common selection is different custom sequences as per required Contract Type and Operating Unit. Any custom string can be added to the derived sequence, for example, FY01-001.

Manual Numbering

The user can enter any value in the Contract Number field for a CLM document. If this manually entered number is not unique for a Contract Type – Operating Unit combination, the system displays an error.

Descriptive Flex Fields

As an implementer, you can set up descriptive flexfields to generate a number sequence in the contract number field. For more information on setting up DFFs for manual numbering, refer to the sections Pre-requisite steps for DFF Numbering and Autonumbering Steps.

How the sequence and Contract Repository Auto-Numbering Enabled profile option work together:

The system looks for an autonumbering value in the following sequence:

If the DFF is set at the Contract Type and OU combination, that autonumbering value is displayed.. Otherwise, if the DFF is set at the Contract Type alone, that the system displays that. If both levels are not found, a free text field to enter the number is displayed for the user.

Pre-requisite steps for DFF Numbering

  1. The profile option Contract Repository Auto-Numbering Enabled should be set to No for the DFF numbering to work. If this profile option is set to Yes, then autonumbering will be in operation for the SBCR and APS documents.

  2. Using the System Administrator responsibility, navigate to Application > Flexfields > Descriptive > Segments.

  3. The Descriptive Flexfields Segments page enables you to create and specify the numbering sequences for each of your contract documents with a Contract Type and Operating Unit combination. The DFF setup has to be performed for the Contract_Type_code and ORG_ID. For example, REP_SBCR_204 (where 204 is the OU id for Vision Operations).

  4. The descriptive flexfield (DFF) is predefined for Repository Contract Document Numbering. The definition has to be created by the customer.

  5. Run a search (Function key F11 and enter Repository Contract Document Number; then use the Ctrl-F11 function key combination) for the Title of the descriptive flexfield segment. When the details appear on the window, you need to first unselect the Freeze Flexfield Definition check box in order to be able to make updates to the segments and contexts.

  6. In the Context Field Values region, ensure that the following values are set:

    Contract Type Code
    Small Business Coordination Record REP_SBCR
    Acquisition Plan Summary REP_ACQ
  7. Place your cursor on a Code (for example: REP_SBCR) and then click Segments. In the Segments window, specify a value for the Name and Window Prompt (for example: SBCR Document Number). Select a value for the Column field (for example: DOC_NUM_ATTR1). Save your work and return to the Descriptive Flexfields Segments window.

  8. Select the Freeze Flexfield Definition check box again in order to complete your updates. Click Compile to compile your flexfield definitions and then save your work. Close the window when done.

Autonumbering Steps

Handling Exceptions

Ascertain the required behavior and handle exceptions accordingly:

INPUT PARAMETERS
p_doc_type Document Type of Contract
p_org_id Organization id
RETURN VALUE
contract number that is generated by this method. 

Customers have to write their own logic to derive the contract number according to their requirements. Ensure that the contract number is unique for a given combination of Operating Unit and Contract Type.

Customizing GL Date Defaults

Package name: PO_CUSTOM_FUNDS_PKG. Procedure name: gl_date.

Following is the 5 level preference check for defaulting the GL Date:

  1. The first preference is the date passed.

  2. The second preference is the System Date.

  3. The third preference is the Earliest Open Period date, which is in the near Future period (the period is open)

  4. The fourth preference is the Earliest Open Period date, which is in near Past period (the period is open)

  5. Call the custom hook to obtain the customer's preferred GL (General Ledger) Date.

Customizing Novation Exceptions

You can extend the Novation Exception function by using the following custom hook:

The procedure name is PO_CUSTOM_MULTIMOD_VAL_PVT.generate_custom_exceptions.

The custom hook is applicable to all CLM documents selected for Supplier Change (Novation) action.

Location of file: $PO_TOP/patch/115/sql/PO_CUSTOM_MULTIMOD_VAL_PVT.pls, $PO_TOP/patch/115/sql/PO_CUSTOM_MULTIMOD_VAL_PVT.plb

The packages are always enabled, requiring no profile options to enable them.

The documentation on how to code these custom checks is available in the file comments.

Extending EDA

The XML file for EDA is generated using predefined data template PO Generate XML for EDA (POEDAXML). The default package linked to this data template is PO_EDA_DATATEMPLATE_PKG. Values that cannot be directly queried from underlying tables are processed by the methods in the PO_EDA_DATATEMPLATE_PKG plsql package to return appropriate values. PO_EDA_MAPPING is a reference table that has been modeled to capture the descriptions required by PDS schema for some of the data elements that have different descriptions/names in the underlying tables. PO_EDA_UDA_ATTR_VALUE is a reference table which gets populated in the 'afterParameterFormTrigger' of the data template and holds the values for all UDA groups (Header/Line/Shipment) that has been configured for the given document.

If your agency requires to extend/customize the XML generation logic, you need to perform the following steps:

  1. Copy the predefined data template definition available at $PO_TOP/patch/115/publisher/defs/POEDAXML.xml to your working directory.

  2. Review the existing mappings in the data template and plan your changes.

  3. If the value/name/description in the underlying table doesn't meet the specification of the PDS schema, you may need to add some entries to the PO_EDA_MAPPING table.

  4. If you have configured new attribute groups as part of the implementation, the UDA values are already updated in the PO_EDA_UDA_ATTR_VALUE reference table and are available for mapping to the PDS schema.

  5. Add a new data definition using XML Publisher Administrator responsibility and upload your customized file. This data definition can be used as a parameter when the Generate XML File for EDA concurrent program that generates the required XML.

The XML for EDA that is generated complies with the latest PDS schema. The system generates the required files (XML, index file and document PDF file) and places them in a configurable directory. Implementers need to evaluate their available options for reporting the files to GEX for the current release.

Extending MIPR

The submission checks for Addresses and MIPR Acceptance region are found in the PL/SQL package called PO_FED_FIELD_FUNCTIONS.

  1. The pr_addresses_XSC procedure validates if the Invoice Office and Assisting Office have values entered. If not, an error message is displayed.

    Error Messages:

    PO_LOCATION_NOT_NULL -> Location cannot be null for &Office

    PO_CONTACT_NOT_NULL -> Contact cannot be null for &Office

  2. MIPR Acceptance region: If a value is selected for Funds Information, user must enter Amount corresponding to it.

    IF p_funds_info IS NOT NULL AND p_amount IS NULL THEN
                                    x_return_status := FND_API.G_RET_STS_ERROR;
                        x_errorcode     := '-1';
                        l_msg_count     := l_msg_count + 1;
                        x_msg_count     := to_char( l_msg_count) ;
                        x_msg_data  := 'Enter a value for Amount if you have selected a value in Funds Information.' ;
                    fnd_message.set_name(d_appln_short_name,'ICX_AMOUNT_NOT_NULL') ;
                            fnd_msg_pub.ADD;
        END IF;
    

    Error Codes: ICX_AMOUNT_NOT_NULL -> Enter a value for Amount if you have selected a value in Funds Information.

    If MIPR Acceptance status is Rejected or Rejected with changes, user must enter Remarks for it. Error code: ICX_REMARKS_NOT_NULL -> Enter the remarks if MIPR Acceptance Status is Rejected with changes.

Using BI Publisher Templates

In order to develop reports associated for the MIPR feature, PDF and RTF templates are used as the reports were available in PDF format. To create these reports, standard XML publisher API and setup is used.

To create a report in XML publisher, the Data definition XML and a template is required. For the DD448/DD448-2 form, both PDF and RTF templates are used, because the report's face page was designed using PDF template and continuation page using RTF template. The data definition that is created is common to both the pages (face page and continuation page) and both the reports (DD448 and DD448-2).

Data Definition : ICXMIPRDD448 PDF

Template for DD448 (Face page): ICXMIPRDD448

RTF Template for DD448 (Cont. page): ICXDD448SUB

PDF Template for DD4482 (Face page): ICXMIPRDD4482

RTF Template for DD4482 (Cont. page): ICXDD4482SUB

As of now, these template names were created in predefined instance and hard coded. The API related to reading these template names have to be overridden by the implementer.

PLSQL package: ICX_DATATEMPLATE_PKG

Procedure: GET_TEMPLATES_FOR_DD448() and GET_TEMPLATES_FOR_DD448_2()

Definition:

PROCEDURE GET_TEMPLATES_FOR_DD448(x_facePageTemplate OUT NOCOPY VARCHAR2,
                                                        x_contPagesTemplate OUT NOCOPY VARCHAR2,
                                                        x_datadef OUT NOCOPY VARCHAR2) IS
BEGIN
        -- Code need to be written for getting PDF template code for DD448 report.
         x_facePageTemplate := 'ICXMIPRDD448';
         x_contPagesTemplate := 'ICXDD448SUB';

        SELECT data_source_code INTO x_datadef
         FROM XDO_TEMPLATES_VL
         WHERE template_code = 'ICXMIPRDD448';
END GET_TEMPLATES_FOR_DD448;

Customizing ACRN Generation

You can implement custom ACRN generation logic by using the following code hook: Procedure for custom ACRN generation : PO_CUSTOM_ACRN_PKG.build_acrn

The ACRN generation code starts when a document is saved, or when the Regenerate ACRN action is explicitly selected by the user.

The code hook overrides the standard ACRN generation logic (The standard code generates ACRNs based on the distribution Charge Account and External Line Of Accounting (LOA). The custom logic may be based on other distribution fields).

The custom hook for Funds Check is applicable to the following CLM documents:

Documentation for customizing ACRN generation is available as comments in the file PO_CUSTOM_ACRN_PKG.plb.

Location of the files:

$PO_TOP/patch/115/sql/PO_CUSTOM_ACRN_PKG.pls

$PO_TOP/patch/115/sql/PO_CUSTOM_ACRN_PKG.plb

The packages are always enabled, requiring no profile option to enable them.

Repository Contract Printing

CLM enables you to print repository contracts using predefined data templates and layout templates. However, you can customize the data templates to adapt to your agency requirements. Implementers can make customize the data definition and layout template and generate the repository contract pdf as per their agency requirement.

Using the Contracts Workbench Administrator responsibility, navigate to Contracts > Contracts Setup > Contract Types. Search for your contract type using the Contract Types: Simple Search page. Click the Update icon to open the Update Contract Type page.

Select Contract Preview Layout Template from the Layout Template list of values. Then select OKCPREVCON from the Data Template list of values.

Implementers will need to make changes to the XML format of the data template to customize the template for individual agencies.

Click Apply to save your work and return to the Contract Types : Simple Search page.

Click the Contracts tab to create a contract based on the Contract Type associated with the data template and layout template you selected.

Click the Create Contract link in the Shortcuts menu (top right corner) to create a contract. In the Create Contract page, select your Contract Type (with the associated data templates and layout templates) using the Type list of values.

Enter the rest of the contract details and click Apply. The created contract can be previewed using the Preview Contract action. Use the Actions list of values to select the Preview Contract action and click Go. You can either save or open the pdf when prompted to do so. The pdf format is displayed based on the layout template.

Multi-Row Variables

The following steps enable you to set up multi-row variables for CLM Contracts. Multi-row variables are used in clauses to define and enter variables belonging to the same family. For example, the Hazardous Material multi-row variable enables you to enter values for hazardous material (uranium, plutonium, lead, etc.) in a sequence of rows using User Defined Attributes (UDA).

Using the Hazardous Material multi-row variable as an example, you can learn the setup steps involved in creating a multi-row variable.

  1. Define Attribute Group and Attributes for Multi-Row Variable

    Using an appropriate Contract Terms Library Administrator responsibility, navigate to the Attribute Group tab. Using this tab, create an Attribute Group, with 2 attributes. The steps are:

    1. Click Create to open the Create Attribute Group for OKC Clause Variables Extension Attributes page. Enter example data in the following columns:

      • Internal Name: HAZARD_MATERIAL

      • Display Name: Hazardous Material

      • Description: Hazardous Material

      • Behavior: Multi-Row

      • Number of columns shown in the table: 2

      • Number of rows shown in the table: 10

    2. In the Business Entities region, select both Business Entities: Contract Clause Variables and Contract Clause Variables History.

    3. Then click Apply and Add Attributes.

    4. The Create Attribute page displays. Enter the following:

      • Internal Name: MATERIAL

      • Display Name: Material

      • Sequence: 1

      • Data Type: CHAR (this can be any data type, depending on the multi-row variables you are defining)

      • Column: C_EXT_ATTR1

      • Enabled check box: select this check box

      • Required: select this check box if you need to make this a mandatory attribute

      • Display As: Text Field

    5. Click Apply and Add Another to add the second attribute.

      • Internal Name: IDNUM

      • Display Name: Identification Number

      • Sequence: 2

      • Data Type: CHAR (this can be any data type, depending on the multi-row variables you are defining)

      • Column: C_EXT_ATTR2

      • Enabled check box: select this check box

      • Required: select this check box if you need to make this a mandatory attribute

      • Display As: Text Field

    6. Click Apply to save your changes. You will return to the Attribute Group Details page. This page shows you the details of your attribute group, business entities, attributes, etc.

    7. In the Attributes region, select the attributes and click Maintain Unique Key. The value in the column Part of Unique Key changes to Yes for each attribute that is part of the unique key. The Unique Key is a set of attributes whose combination will uniquely determine a row in the attribute group.

      Setting the Unique Key is mandatory for multi-row variables, failing which users cannot add multiple rows in the table while updating values.

  2. Create RTF Template

    Create a RTF layout template. To define an RTF template you need dummy XML data.

    The XML generated for variable values is always in the following form.

    <VAR_VALUE> <= Always Root Element
     <HAZARD>    <= INTERNAL Name of the 'Attribute Group' <MATERIAL>Uranium</MATERIAL> <= INTERNAL Name of the 'Attribute.
      <IDNUM>0001</IDNUM> <= INTERNAL Name of the 'Attribute.
    ..
    </HAZARD> 
            <HAZARD>
                    <MATERIAL>Plutonium</MATERIAL>
                    <IDNUM>0002</IDNUM>
            </HAZARD>
     ….
     ……
    </VAR_VALUE>
    

    Use the above XML format to define your RTF template for the attribute group created above.

    The RTF template is required to generate the PDF format for the variables in the clause to print during preview.

  3. Register RTF Template

    Navigate to XML Publisher Administrator > Home > Templates.

    Click Create Template and enter / select the following information:

    • Template Name: enter a name of your choice

    • Code: enter a code of your choice

    • Application: Contracts Core

    • Type: RTF

    • Data Definition: Multi Row Variable Data Def

    In the Template Files region, upload the RTF template that was created in the previous step.

    Select Language as required – English or the language in which you have defined the template.

  4. Define Variable

    Navigate to Contracts Terms Library Administrator > Contracts > Contract Terms Library > Variables. Click Create Variable.

    Enter or select to complete the following field entry:

    • Variable Code

    • Variable Name

    • Description

    • Value Set

    • Intent

    • Multi Row Variable check box – select this check box, in order to enter data in the following columns:

      • Layout Template: (for example, Hazardous Material, the value of the XDO Template you created in the previous step)

      • Attribute Group: (for example, Hazardous Material, the attribute group name you created in the first step)

    • Source: Manual

  5. Link the variable to a Clause

    Navigate to Contracts Terms Library Administrator > Contracts > Contract Terms Library > Clauses. Search for the clause to link the multi-row variable, or click Browse to view all the clauses within a clause group.

    Select your clause, and open the Clause page. Use the Variables region to add a variable to the clause. Click Add Variable first to add the variable to the Variables region. Then click Insert in the Variables row to insert the variable at the correct position in the Clause text box. Click Apply or Submit to ensure your changes are saved.

  6. Update Variable Value and Preview

    You can update the multi-row variable value in awards or solicitations after adding the required clause. Use the action Update Variable Values to open the Update Variable Values page. Enter or update the multi-row variable values and click Apply. You can see the values as part of the contract document, using the Preview Contract action.