CPQ-Order Management Integration Guide 21B
CPQ-Order Management Integration Guide 21B
Management Integration
Guide
Update 21B
APR 2021
Copyright © 2021, Oracle and/or its affiliates
Table of Contents
Introduction .......................................................................................................................................................................... 4
Purpose ...............................................................................................................................................................................................4
Audience .............................................................................................................................................................................................4
Prerequisites .......................................................................................................................................................................................4
Acronym List ....................................................................................................................................................................................... 5
Order Flow Overview ........................................................................................................................................................... 6
Create Order Process Flow ................................................................................................................................................................ 6
Cancel Order Process Flow ................................................................................................................................................................ 6
OIC Integration Installation and Setup .............................................................................................................................. 7
Import Integration Package .............................................................................................................................................................. 7
OIC Mapping Details ........................................................................................................................................................................ 10
Header Attribute Mapping ........................................................................................................................................................................... 10
Line Attribute Mapping ................................................................................................................................................................................. 11
Charge Attribute Mapping ........................................................................................................................................................................... 12
Charge Attribute Mapping for List and Net Prices ................................................................................................................................. 12
Charge Attribute Mapping for Adjustments ............................................................................................................................................ 13
Manual Price Adjustment Mapping ........................................................................................................................................................... 14
Oracle CPQ Package Installation and Setup .................................................................................................................... 15
CPQ Integration Center Setup ......................................................................................................................................................... 15
Create OIC Integration in CPQ Integration Center ................................................................................................................................. 15
Generic Integrations ...................................................................................................................................................................................... 17
Install CPQ-Oracle Order Management Package .......................................................................................................................... 18
Commerce Integrations ................................................................................................................................................................... 19
Commerce Integration for Get Sales Order Status from Oracle Order Management ................................................................... 19
Commerce Integration for Cancel Sales Order from CPQ .................................................................................................................... 21
Commerce Integration for Update Fulfillment Line Status.................................................................................................................. 22
Commerce Integration for Update Asset .................................................................................................................................................23
Commerce Actions ........................................................................................................................................................................... 24
Get Sales Order Status from FOM Action ............................................................................................................................................... 24
Cancel Order Action ......................................................................................................................................................................................25
Update Asset Action ..................................................................................................................................................................................... 26
Enable Subscription Ordering for Simple Products (Optional) .................................................................................................... 27
Pricing Setup ..................................................................................................................................................................................... 27
Order Management Setup ................................................................................................................................................ 28
Enable Business Events ................................................................................................................................................................... 28
Manage Trigger Points for Business Events .......................................................................................................................................... 28
Send Status Updates for Fulfillment Lines ............................................................................................................................................. 28
Setting Up Order Management Event Subscriptions....................................................................................................................30
Get the CSF Key ............................................................................................................................................................................................. 30
Register the CSF Key in Order Management ......................................................................................................................................... 30
Installed Oracle CPQ Elements .......................................................................................................................................... 31
Commerce Attributes ....................................................................................................................................................................... 31
Commerce Actions ........................................................................................................................................................................... 31
Create Order .................................................................................................................................................................................................... 31
Get Sales Order Staus from Oracle Order Management ..................................................................................................................... 34
Cancel Order....................................................................................................................................................................................................35
Update Asset ...................................................................................................................................................................................................35
Save ...................................................................................................................................................................................................................35
Save (Line) .......................................................................................................................................................................................................35
Customer Details ............................................................................................................................................................................................35
Library Functions ............................................................................................................................................................................. 36
Validation Rules ................................................................................................................................................................................ 36
Main Document - Validate Line Status Values for Creation ............................................................................................................... 36
Hiding Rules ...................................................................................................................................................................................... 37
Main Document - Hide Create Order ........................................................................................................................................................ 37
Main Document - Hide Cancel Order ........................................................................................................................................................ 37
Main Document - Hide SO Status Action ................................................................................................................................................ 38
Oracle CPQ Field Setup ..................................................................................................................................................... 39
Business Unit ID Field ...................................................................................................................................................................... 39
Account Fields .................................................................................................................................................................................. 39
Part Custom Fields .......................................................................................................................................................................... 40
Layout Fields ..................................................................................................................................................................................... 41
Demo Product Setup ......................................................................................................................................................... 43
Install the BOM Data Table Packages ............................................................................................................................................ 44
Install the Parts Package................................................................................................................................................................. 44
Install the ATO and PTO Demo Product BOM Package ................................................................................................................45
Verify the Addition of All BOM Parts ..............................................................................................................................................45
Deploy the Home Page ................................................................................................................................................................... 46
Order Management Pricing Integration ............................................................................................................................. 1
Enable Pricing ..................................................................................................................................................................................... 1
Charges ............................................................................................................................................................................................... 1
Adjustments........................................................................................................................................................................................ 1
Pricing Engine Setup .......................................................................................................................................................................... 2
ORCL_PRC_BASE_CHGS ................................................................................................................................................................................ 2
ORCL_PRC_ADJUSTMENTS .......................................................................................................................................................................... 2
Pricing Profile Configuration ......................................................................................................................................................................... 3
Pricing Related Utility BML ............................................................................................................................................................................ 5
Roll Up Charges .................................................................................................................................................................................. 9
Oracle CPQ Account Integration ........................................................................................................................................ 11
Library Functions .............................................................................................................................................................................. 11
Manual Data Table Changes ............................................................................................................................................................12
Add Template Dependencies to File Manager .............................................................................................................................. 13
Appendix A: Create Order .................................................................................................................................................. 14
Appendix A1: Create Order – Standard Item Workflow................................................................................................................. 14
Appendix A2: Create Order – Configurable Item Workflow.......................................................................................................... 16
Appendix B: Auto Sync Status Workflow ......................................................................................................................... 18
Appendix C: Cancel Order Workflow ................................................................................................................................ 19
Appendix C1: Full Order Cancellation ............................................................................................................................................. 19
Appendix C2: Partial Order Cancellation ........................................................................................................................................20
Appendix D: Commerce Attributes ................................................................................................................................... 21
Appendix D1: Main Document (e.g. Transaction) Attributes ........................................................................................................21
Appendix D1: Sub-Document (e.g. Transaction Line) Attributes................................................................................................. 24
Appendix E: BML .................................................................................................................................................................27
Appendix E1: BML - Create Order ................................................................................................................................................... 27
Appendix E2: BML - Get Sales Order Status from FOM ................................................................................................................ 28
Appendix E3: BML - Cancel Order...................................................................................................................................................30
Cancel Order................................................................................................................................................................................................... 30
Parse Response ............................................................................................................................................................................................. 34
Appendix E4: BML - Update Fulfillment Line Status .................................................................................................................... 35
Appendix E5: BML - Update Asset .................................................................................................................................................. 38
Appendix E6: BML – Save ................................................................................................................................................................ 41
Appendix E7: BML – Save (Line) ..................................................................................................................................................... 43
Appendix E8: BML - Customer Details .......................................................................................................................................... 44
Appendix F: Pricing Related Utility BMLs........................................................................................................................ 47
Post Default on Line Item FOM (oRCL_fOM_postDefaultOnLineItem) ............................................................................................ 52
Manual Adjustment Calculations ....................................................................................................................................................59
Populate Prices (oRCL_fOM_populatePrices) ........................................................................................................................................ 59
Calculate Manual Adjustment (calculateManualAdjustment)............................................................................................................. 61
Calculate Unit Manual Adjustment (calculateUnitManualAdjustment) ........................................................................................... 63
Calculate Total Manual Adjustment (calculateTotalManualAdjustment) ....................................................................................... 64
Get Charge Type for Manual Adjustment (getChargeTypeForManualAdjustment) .................................................................... 65
Appendix G: Payload Template Files ............................................................................................................................... 66
findOrganizationPayload.txt ...................................................................................................................................................................... 66
customerAccountPayload.txt ..................................................................................................................................................................... 67
Appendix H: Miscellaneous Commerce Library Functions ........................................................................................... 68
String getTemplateLocation(String system, String operation).......................................................................................................... 68
String invokeWebService(String system, String soapReq) ................................................................................................................. 68
2
Appendix I: CPQ-OM Status Mapping ............................................................................................................................. 69
CPQ Main Document Order Status ........................................................................................................................................................... 69
CPQ Sub-Document Line Status ............................................................................................................................................................... 69
Map CPQ Line Status to Order Management Line Status................................................................................................................... 69
Appendix J: OIC Integration - UPDATESOSTATUSFROMFOM...................................................................................... 71
Appendix K: Retrieve OIC Integration Endpoint URL .....................................................................................................72
Appendix L: Limitations and Troubleshooting............................................................................................................... 73
Appendix L1: Limitations ................................................................................................................................................................. 73
Appendix L2: Troubleshooting........................................................................................................................................................ 73
Resolve Issues with Create Order Action..................................................................................................................................................73
Assets Not Created in CPQ Assets Repository ........................................................................................................................................73
Blank Line Status on click of ‘Get SO Status from FOM’ button .........................................................................................................73
3
Revision History
This document will continue to evolve as existing sections change and new information is added.
Introduction
This integration includes:
REST-based Integration with Oracle Order Management using Oracle Integration Cloud (OIC)
Support for pre-priced Order creation and cancellation
Asynchronous update of quote order and line status from Oracle Order Management
Purpose
This installation guide describes how to implement the reference integration between Oracle CPQ and Oracle Order Management
using order management REST APIs and OIC.
Audience
This installation guide is intended for administrators responsible for setting up and configuring the Oracle CPQ - Order Management
solution. This guide assumes administrators have prior Oracle CPQ, Oracle Order Management, and OIC administration experience.
Prerequisites
Administrators must integrate the Oracle CPQ 21B Base Reference Application (RefApp) image with the following:
Notes:
Administrators performing the integration installation must have administrator privileges on the Oracle CPQ,
Order Management, and OIC sites.
For information about obtaining any of the above prerequisites, contact My Oracle Support.
4
Acronym List
Definitions of the acronyms used within this document are provided in the following table. For additional information, refer to the
Oracle CPQ Administration Online Help.
BML Big Machines A scripting tool used to capture a company’s complex business logic within Oracle CPQ
Extensible Language configuration and commerce.
BOM Bill of Material Fulfillment systems often maintain BOMs containing complex, multi-level part structures that
differ from the configuration attributes used in Oracle CPQ when sales users configure
products. BOM mapping provides a data-driven mechanism for mapping these differing
product views. To use the Order Management solution to create an order from an Oracle CPQ
transaction, the products must be modeled as a BOM.
CPQ Configure Price and This Oracle solution enables companies to streamline their entire opportunity-to-quote-to-
Quote order process, including product selection, configuration, pricing, quoting, ordering, and
approval workflows.
OM Order Management Oracle Order Management, previously known as Fusion Order management, is designed to
improve order capture and fulfillment execution across the quote to cash process by
providing a central order hub for multi-channel environments. The application provides the
ability to capture, price and configure orders through direct order entry.
OIC Oracle Integration Oracle Integration Cloud Service is a cloud-based integration application designed to perform
Cloud integrations between cloud-based applications – but also has capabilities that extend beyond
that, to performing integrations with your on premises applications.
5
Order Flow Overview
6
OIC Integration Installation and Setup
This section contains information about importing the OIC Integration package into your OIC environment and creating web service
connections between Oracle CPQ and Oracle Order Management.
Prerequisites
The SSL certificate of OIC environment is installed in Oracle Order Management for ERP event subscription.
All required SSL certificates (CPQ and Order Management SSL certificates) are in OIC environment.
7
7. Select Connections in the left side navigation panel, verify the following connections have been imported:
o CPQ REST Connection
o ERP Events Connection
o FOM REST Connection
o CPQ SOAP Connection
8. Select Lookups in the left side navigation panel, verify the following lookups have been imported:
o CPQ-FOM-LineStatusDVM
o CPQ-FOM-AdjustmentBasisDVM
o CPQ-FOM-ChargeDefinitionDVM
c. Enter your CPQ administrator user name and password in the corresponding fields.
e. Click Save.
8
10. Configure the CPQ SOAP Connection
d. Enter your CPQ administrator user name and password in the corresponding fields.
f. Click Save.
f. Enter your Order Management username and password in the corresponding fields.
h. Click Save.
Note: The integration Order Management user should have appropriate roles to Create Orders using the
Order Management REST APIs.
c. Enter your Fusion user name and password for Fusion in the corresponding fields.
e. Click Save.
13. On configuration editor page click on activate button for all four integrations one by one and activate all integration.
Notes:
If an integration with the same name already exists in the OIC environment, deactivate the integration before replacing it.
Oracle recommends that the Enable Tracing and Include Payload options are selected when activating an integration.
Doing so will capture valuable troubleshooting information that may be useful in troubleshooting a failed integration
run/instance.
9
OIC Mapping Details
This section contains the OIC mapping details of the Order Management payload and Oracle CPQ attribute
BuyingPartyContactLastName _customer_t_last_name
BuyingPartyName _invoiceTo_t_company_name OR
customerCompanyName_t
FreezePriceFlag freezePriceFlag_t
FreezeShippingChargeFlag freezePriceFlag_t
FreezeTaxFlag freezePriceFlag_t
OrderKey orderKey_t
CancelReasonCode cancelReason_t
StatusCode status_t
PackingInstructions packingInstructions_t
PartialShipAllowedFlag oRCL_ERP_PartialShipAllowed_t
PaymentTerms paymentTerms_t
RequestingBusinessUnitName businessUnitName_t
RequestingBusinessUnitId businessUnitId_t
SourceTransactionId bs_id
SourceTransactionNumber transactionID_t
SourceTransactionSystem oRCL_ERP_CPQSourceSystemCode_t
TransactionOn orderDate_t
TransactionTypeCode transactionTypeCode_t
TransactionalCurrencyCode currency_t
10
Line Attribute Mapping
Order Management Attribute Mapped to CPQ Attribute Comments
EndCreditMethodCode changeCode_l When oRCL_ABO_ActionCode_l =
‘TERMINATE’ (For future use)
EndDate contractEndDate_l When oRCL_ABO_ActionCode_l =
‘TERMINATE’ (For future use)
EndReasonCode changeReason_l When oRCL_ABO_ActionCode_l =
‘TERMINATE’ (For future use)
associatedProductReferences – associatedLineId_l Applicable only for Subscription Lines with
SourceLineId Associations (For future use)
associatedProductReferences - associatedOrderId_l Applicable only for Subscription Lines with
SourceOrderId Associations (For future use)
associatedProductReferences - oRCL_ERP_CPQSourceSystemCode_t Applicable only for Subscription Lines with
SourceOrderSystem Associations (For future use)
SubscriptionProfileId subscriptionProfileId_t Applicable only for Subscription Lines. ie.,
_part_custom_field9 = ‘product’
(For future use)
externalAssetReference - itemInstanceId_l Applicable only for Subscription Lines. ie.,
ExternalAssetKey _part_custom_field9 = ‘product’
(For future use)
ActionTypeCode ‘ORA_END’ When oRCL_ABO_ActionCode_l =
‘TERMINATE’ (For future use)
CancelReasonCode cancelReason_l
OrderedUOMCode oRCL_pRC_quantityUOM
PackingInstructions oRCL_ERP_PackingInstr_l
ParentSourceTransactionLineId parentDocNumber_l
PartialShipAllowedFlag oRCL_ERP_PartialShipAllowed_t
RequestedFulfillmentOrganizationCode fulfillmentOrganizationCode_l
RequestedShipDate oRCL_ERP_RequestShipDate_l
ShipSetName oRCL_ERP_ShipSet_l
ShippingInstructions oRCL_ERP_ShippingInstr_l
SourceScheduleNumber _document_number
SourceTransactionLineId _document_number
SourceTransactionLineNumber _document_number
SourceTransactionScheduleId _document_number
StatusCode status_l
TransactionCategoryCode transactionCategoryCode_l
11
Charge Attribute Mapping
Order Management Attribute Mapped to CPQ Attribute Comments
ApplyTo oRCL_applyTo
ChargeCurrencyCode currency_t
PricedQuantityUOMCode oRCL_pRC_quantityUOM
PrimaryFlag oRCL_primaryCharge
RollupFlag rollupFlag_l
SequenceNumber oRCL_chargeSequenceNumber
SourceChargeId oRCL_chargeName
ChargeCurrencyUnitPrice oRCL_unitPrice
HeaderCurrencyCode currency_t
HeaderCurrencyDurationExtendedAmount oRCL_listPrice
HeaderCurrencyExtendedAmount oRCL_listPrice
HeaderCurrencyUnitPrice oRCL_unitPrice
12
Charge Attribute Mapping for Adjustments
Order Management Attribute Mapped to CPQ Attribute Comments
ChargeCurrencyCode currency_t
HeaderCurrencyDurationExtendedAmount oRCL_totalAutoAdjustment OR
oRCL_totalManualAdjustment
HeaderCurrencyExtendedAmount oRCL_totalAutoAdjustment OR
oRCL_totalManualAdjustment
HeaderCurrencyUnitPrice oRCL_autoAdjustment OR
oRCL_manualAdjustment
PriceElementCode ‘QP_CUSTOM_ADJUSTMENT’
PriceElementUsageCode ‘PRICE_ADJUSTMENT’
RollupFlag False
13
Manual Price Adjustment Mapping
Order Management Attribute Mapped to CPQ Attribute Comments
AdjustmentAmount oRCL_manual_adjustmentValue_l OR
oRCL_auto_adjustmentValue_l
AdjustmentElementBasis oRCL_manual_adjustmentBasis_l OR Uses OIC lookup for domain value map
oRCL_auto_adjustmentBasis_l CPQ-FOM-AdjustmentBasisDVM
AdjustmentType oRCL_manual_adjustmentType_l OR
oRCL_auto_adjustmentType_l
ChargeDefinitionCode oRCL_manual_adjustmentChargeName_l Uses OIC lookup CPQ-FOM-ChargeDefinitionDVM
OR oRCL_auto_adjustmentChargeName_l for domain value map
ChargeRollupFlag False
Comments oRCL_manual_adjustmentName_l OR
oRCL_auto_adjustmentName_l
EffectiveNumberOfPeriods oRCL_manual_numberofPeriods_l OR Applicable only when Product is subscription and
oRCL_auto_numberOfPeriods_l oRCL_manual_adjustmentChargeType_l =
ORA_RECURRING AND
oRCL_manual_adjustmentEffectivity_l =
ORA_ALL_TERM (For future use)
EffectivityTypeCode oRCL_manual_adjustmentEffectivity_l Only when Product is subscription and
OR oRCL_manual_adjustmentChargeType_l =
oRCL_auto_adjustmentEffectivity_l ORA_RECURRING (For future use)
Reason oRCL_manual_adjustmentReason_l OR ‘Price match’ – For Auto Adjustment
‘Price match’
SequenceNumber oRCL_manual_adjustmentSequence_l
OR oRCL_auto_adjustmentSequence_l
SourceManualPriceAdjustmentId oRCL_manual_adjustmentSequence_l
OR oRCL_auto_adjustmentSequence_l
14
Oracle CPQ Package Installation and Setup
Oracle creates implementation packages as a way to distribute elements needed by customers to implement new Oracle CPQ
features. This section contains information about importing the CPQ -Order Management Package into your CPQ environment.
CPQ - Order Management Package Granular migration CPQ package containing CPQ artifacts in support of the Order
File Name : (CPQ_FOM_Package_21B.zip) Management Integration solution.
Note: This package also contains some of the artifacts related to subscription products handling in CPQ and Order Management
Integration for a future release.
Note: OIC is also known as Integration Cloud Service (ICS). When creating the OIC integration in the Integration Center,
select Integration Cloud Service as the integration type. Also use the same user name and password that was used to
import the integration package in OIC.
15
Perform the following steps to create an OIC integration.
5. Enter OSSICS in the Name field. The variable name should be oSSICS on both the source and the target site.
6. Enter the discovery URL in the following format: https://<OIC hostname>/icsapis/v1/integrations
The host name is the OIC environment name.
8. Click Test to verify the connection. The status must return “Test Connection Passed” before proceeding.
16
Generic Integrations
Generic integration is required to invoke OIC integrations for Cancel Order and Get Order Status from FOM
Perform the following steps to create a generic integration to get sales order status from Order Management.
9. Click Save.
17
Generic Integration for Cancel a Sales Order from CPQ
This integration uses the OIC CancelSOfromCPQ integration endpoint URL. Refer to Appendix K for instructions to retrieve the
endpoint URL of an OIC integration.
Perform the following steps to create a generic integration to cancel a sales order from CPQ.
9. Click Save.
1. Download the Oracle Order Management package (i.e. CPQ_FOM_Package_21B.zip) from My Oracle Support.
4. Select Import Package from the Select A Mode drop-down. The Upload Package dialog opens.
6. Select the target process from the Choose a target process for Cross Process Migration drop-down.
7. Click Upload.
8. Click Migrate.
When the migration completes, check the migration logs for errors.
18
Commerce Integrations
Create the following commerce BML type integrations:
Commerce Integration for Get Sales Order Status from Oracle Order Management
Perform the following steps to create a commerce BML integration to get sales order status from Order Management.
3. Select Integrations from the appropriate commerce process Navigation drop-down, and then and click List.
4. Click on Add.
9. Click Define to add a BML Function. A new window pops up to Select Attributes.
19
11. Select the getSOStatusFromFOM function, in the Commerce Library Functions section, and then click Next.
return commerce.getSOStatusFromFOM();
20
Commerce Integration for Cancel Sales Order from CPQ
Perform the following steps to create a commerce BML integration to cancel a sales order status from CPQ.
4. Click on Add.
7. Click Define to add a BML Function. A new window pops up to Select Attributes.
9. Select the cancelOrder function, in the Commerce Library Functions section, and then click Next.
return commerce.cancelOrder();
21
Commerce Integration for Update Fulfillment Line Status
Perform the following steps to create a commerce BML integration to update fulfillment line status.
4. Click on Add.
7. Click Define to add a BML Function. A new window pops up to Select Attributes.
9. Select the updateFulfillmentLineStatus function, from the Commerce Library Functions section, and then click Next.
return commerce.updateFulfillmentLineStatus();
22
Commerce Integration for Update Asset
Perform the following steps to create a commerce BML integration to update an asset.
4. Click on Add.
13. Click Define to add a BML Function. A new window pops up to Select Attributes.
15. Select the updateAsset function, from the Commerce Library Functions section, and then click Next.
return commerce.updateAsset();
23
Commerce Actions
Update following Commerce actions.
3. Select Documents from the appropriate commerce process Navigation drop-down, and then and click List.
4. Select Actions from the main document Navigation drop-down, and then click List.
7. Move the Get SO Status from FOM (BML) integration from Integration List to the Selection Integration window.
24
Cancel Order Action
Perform the following steps to update the Cancel Order action (cancelorder).
4. Select Actions from the main document Navigation drop-down, and then click List.
10. Move the Cancel SO From CPQ (BML) and Get SO Status from FOM (BML) integrations from Integration List to the
Selection Integration window.
Note: If on demand status update functionality is not added user can add only CancelSOFromCPQ.
25
Update Asset Action
Perform the following steps to update the Update Asset action (updateasset).
4. Select Actions from the main document Navigation drop-down, and then click List.
7. Move the Update Fulfillment Line Status (BML) and Update Assets (BML) integrations from Integration List to the
Selection Integration window.
8. Make sure the Selected Integrations are in the following order. If required, use the Up and Down buttons to reorder the
integrations.
3) Update Assets
26
Enable Subscription Ordering for Simple Products (Optional)
Perform the following steps to enable Subscription Ordering for Simple Products.
3. Set the Enable Subscription Ordering for Simple Products option to Yes.
Pricing Setup
The Oracle Order Management package comes with a pricing configuration for the sample BOM for the ATO models. If you are
adding new products, complete the following tasks for new products in BOM data:
Define the price definition for products in Oracle Pricing Data Tables.
Define tier information, if any, for products in the Pricing Data Tables.
You can re-use the existing Pricing profile, enhance condition to run pricing for products in BOM, or add a new Pricing profile.
27
Order Management Setup
Business events must be enabled in Order Management for different Fulfillment Statuses in order to synchronize the order header
and line status and to create assets in the CPQ Asset repository. This section provides steps that are required in Order Management
for integration with OIC using business events. For more details about the setup, refer to the Oracle Order Management Guide.
Note: This will raise a business event and send a notification to each subscriber for the selected trigger points.
5. On the Manage Orchestration Process Definitions page, search for the orchestration process that your deployment uses.
Each orchestration process controls the status value for each fulfillment line, so you must modify the orchestration process
that controls the status value.
6. From search results, click on your process name and click on the pencil icon to edit the process. In the following screenshot
we have selected one example process to demonstrate further steps.
28
7. In the Process Details area, click Status Conditions > Fulfillment Line Status Values > Edit Status Rule Set
8. Edit Status Rule Set page opens with all status conditions listed.
For any status that you want to send out notifications, select the checkbox for ‘Notify External Systems’ column.
10. Deploy
11. Repeat this procedure for each orchestration process in your deployment that updates status values.
29
Setting Up Order Management Event Subscriptions
This step is required to subscribe to the Order Management business events using OIC.
3. Record the CSF Key which is a combination of Identity Domain and Service Instance:
<Identity Domain><Service Instance>
3. Enter CSF key recorded from the “Get the CSF Key” procedure.
6. Click Register.
7. Verify the success message is printed on top.
30
Installed Oracle CPQ Elements
Installing the CPQ - Order Management package simplifies the implementation of Order Management solution by adding the
following elements to the Oracle CPQ RefApp.
Commerce Attributes
Commerce Actions
Library Functions
Validation Rules
Hiding Rules
Commerce Attributes
The installation of the Oracle CPQ – Order Management package adds several attributes to the Commerce process and modifies
several existing attributes included with the Oracle CPQ Release 21B or later RefApp. For a complete list of the Commerce attributes
used by the Order Management solution, refer to Appendix D: Commerce Attributes.
Commerce Actions
The installation of the Oracle CPQ-Order Management package adds or updates the following actions to the Commerce process.
Create Order
Cancel Order
Customer Details
Get SO Status from FOM
Save
Update Asset
Save (Line)
Note: The Oracle Quote to Order Commerce process is included with the Oracle CPQ RefApp. If customers have chosen to
overwrite the Oracle Quote to Order Commerce process with an alternate Commerce process, the Oracle CPQ package adds the
actions to the alternate process.
Create Order
The Create Order action is associated with the Create Order button on the Transaction UI. The action is used to create an order in
Order Management. This action is hidden if the transaction doesn’t contain any line items.
31
Perform the following steps to create the Integration Cloud Service integration.
3. Locate the Commerce process associated with the Order Management integration.
4. Select Integrations from the associated Navigation menu, and then click List.
5. Click Add.
6. Select the Integration Cloud Service option, and then click Next.
Note: The Timeout value is used when calling the CreateSOfromCPQ services. If the service does not
respond within the specified time, Oracle CPQ aborts the web service call and throws an error.
32
Add/Edit Create Order Action
After the Create Order integration is created, the integration is added to the Create Order action’s integration tab.
3. Select Documents from the appropriate commerce process Navigation drop-down, and then and click List.
4. Select Actions from the main document Navigation drop-down, and then click List.
o If the Create Order action exists, select the Create Order action, and then proceed to step 8.
o If the Create Order action does NOT exist, continue to the next step.
7. Enter the following Description: Creates a sales order for submission to an ERP system.
10. Select the Define Advanced Modify - After Formulas option for Advanced Modify - After Formulas.
15. Move the Create Order (Integration Cloud Service) integration from Integration List to the Selection Integration window.
16. Make sure Apply Modify Functions is the following Create Order (Integration Cloud Service) in Select Integration.
If required, use the Up and Down buttons to reorder the integrations.
17. Select the Modify tab, and then select the Transaction tab.
a. Select the radio option for the Order Date attribute, and then click Define.
return commerce.orderDate();
33
b. Select the radio option for the Ordered By attribute, and then click Define.
i. Click Next.
return commerce.orderDate();
c. Select the radio option for the Use Specified Value for the Win/Loss Status attribute.
Current Step
Integration Status
34
Cancel Order
The Cancel Order action is associated with the Cancel Order button on the Transaction UI, and is used to cancel and entire order or
the selected line items.
Update Asset
The Update Asset action is used to create assets in the CPQ Asset Repository based on the order line status. The code associated
with this action is executed via the REST API generated for this action. This REST API is invoked through the orchestration logic in
UpdateSOStatusFromFOM OIC integration.
Commerce Integration for Update Fulfillment Line Status
Update Asset Action
Refer to the following sections for BML scripts:
Appendix E4: BML - Update Fulfillment Line Status
Appendix E5 : BML - Update Asset
For Update Asset REST API usage in integration, refer to Appendix J: OIC Integration - UpdateSOStatusFromFOM.
Save
The Save action is used to calculate the manual adjustments and the roll up charges for all lines.
The Save action has a BML function associated with the Advanced Modify - After Formulas.
For the BML script, refer to Appendix E6: BML – Save.
Save (Line)
The Save (Line) action used to calculate the manual adjustments and the roll up charges for one line.
The Save (Line) action has a BML function associated with the Advanced Modify - After Formulas.
For the BML script, refer to Appendix E7: BML – Save (Line).
Customer Details
The Customer Details action is used to support account integration. When users click the Customer Details tab on the Transaction
page, a Customer Company Name field is available. By entering a customer company name and clicking Customer Details, the
account fields (Party ID, Invoice to Party id, Bill To Site ID) are populated and mapped to the associated Order Management fields.
These field mappings support the creation of a new order in Order Management based on the information provided in the Oracle
CPQ Transaction.
The BML is associated with the Define Advanced Modify - After Formulas function.
Refer to Appendix E8: BML – Customer Details
35
Library Functions
The installation of the Oracle CPQ - Order Management package adds several library functions to the Commerce process. Refer to
Appendix E: BML to view the BML scripts associated with these library functions.
Validation Rules
Validation Rules are used to validate attribute or field values. They are linked to an action and only run when a specific action is
clicked by the user. When the Oracle CPQ - Order Management package is installed, the following Validation Rules are added to the
Commerce process.
Status Active
Condition
Components to Validate
Components ‘Trigger Update Asset for Line Status’ main doc attribute
Operator Equals
Value (Empty)
36
Hiding Rules
Hiding Rules tell Oracle CPQ to hide select attributes or actions, when a pre-defined condition is satisfied. They are made up of a
condition and an action. The values of the attributes selected as the condition attributes determine the result of the condition, which
when True trigger the hiding of the action attributes.
Status Active
Condition
Components to Hide
Status Active
Condition
Row grouping 1
Components to Hide
37
Main Document - Hide SO Status Action
Hides the Get SO Status From FOM action when the order is not created (i.e. if order Key is empty, hide the Get SO Status From
FOM action).
Status Active
Condition
Operator Equals
Value (Empty)
Components to Hide
38
Oracle CPQ Field Setup
Oracle CPQ administrators must setup fields in the CPQ environment and obtain the values for these fields from the Order
Management administrator.
Account Fields
The account information provided during order creation is used for order billing purposes. A sales user can obtain the account
information for a customer by entering a customer company name and clicking Customer Details. The fields listed the following are
populated and are mapped to the associated Order Management fields. These field mappings support the creation of a new order in
Order Management based on the information provided in the CPQ Oracle Transaction. The fields should be added to the Customer
Details tab of the Transaction layout.
39
Part Custom Fields
part_custom_field9 will be used in the future to identify a subscription product. Subscription products will have value "product" for
this field.
To help identify charge line and product, set up “part_custom_field9” as a subscription type configured as shown below. The field
is empty for models and standard products. For Subscription type products, enter the part_custom_field9 value as ‘product’.
40
5. In Field Name, add “Product” as shown in the following image.
6. Click Add.
7. You should see the newly added field in red. If so, click Deploy.
Layout Fields
This section contains the attributes and actions that need to be added to the Transaction layout.
The following main document attributes are required for Order details.
Order Number
Status
Cancel Reason
Payment terms
Customer Company Name
Business Unit Name
Customer Id (_customer_id)
Invoice to Party Id
Party Id
Bill to Site Use Id
Create Order
Cancel Order
Customer Details
Get SO Status from FOM
Save
Save (Line)
41
The following sub-document attributes are required in Line Item Grid.
Document Number
Status
Fulfillment Status
Fulfillment Line Id
Document Number
UnitPrice_NonRecurring
UnitPrice_Recurring
NetPrice_NonRecurring
NetPrice_Recurring
Action Code
Cancelation Reason
InstanceId
RootAssetKey
Calculation Information
Charge Array
Auto Adjustment Array
Manual Adjustment Array
Quantity UOM
Apply To
42
Demo Product Setup
Oracle provides an ATO & PTO demo product, which is a sample Configuration in CPQ. Use the demo product to understand the
functionality available in Oracle Order management.
All the files related to Demo Product Setup are available in CPQ_FOM_Demo_Setup_Files.zip.
Data Table datatable_itemDef.zip The BOM data used for Data Tables.
datatable_itemMap.zip
datatable_AttrDef.zip
datatable_AttrMap.zip
Note: The packages shown in the above table are optional packages. Install the packages to make the ATO and PTO demo
product visible in Oracle CPQ.
43
Install the BOM Data Table Packages
The BOM Data Table packages add the demo product data into Oracle BOM tables, such as the Oracle_BomItemDef,
Oracle_BomItemMap and Oracle_BomAttrMap BOM data tables. When the BOM Data Tables packages are installed, the BOM
Configuration for ATO/PTO model is added to the sample Configuration.
1. Download the BOM Data Table packages (i.e. datatable_ItemDef.zip, datatable_ItemMap.zip, datatable_AttrMap.zip,
datatable_AttrDef.zip) from My Oracle Support.
6. Click Browse.
9. Click Import.
10. Repeat steps 5 through 9 for each of the BOM data table files (i.e. datatable_ItemMap.zip and datatable_AttrMap.zip).
11. Select the Oracle_BomItemDef, Oracle_BomItemMap, and Oracle_BomAttrMap data tables, and then select Deploy from the
Navigation menu.
13. Check the log corresponding to the uploaded files for errors.
Note: Monthly Fee, Consumption Fee, and Activation Fee products appear in the calculatedInfo field in the Line Item Grid.
3. Select Upload under Utilities. The Upload Files List page opens.
4. Click Browse.
6. Click Add.
7. Click Upload.
44
Install the ATO and PTO Demo Product BOM Package
The BOM Package contains the BOM data used for the ATO and PTO demo product.
4. Select Import Package from the Select A Mode drop-down. The Upload Package dialog opens.
6. Click Upload.
7. Click Migrate. When the migration completes, check the migration logs for errors.
8. Navigate to the Admin Home page.
9. Select Catalog Definition under Products. The Supported Products page opens.
17. Select Deployment Center from the PTO-F Navigation drop-down, and then click List
3. Select BOM Root Item List under BOM Products. The BOM Root Items Administration List page opens.
4. Click on the variable names to verify that parts were added. The BOM Item Tree Administration page opens.
Missing parts are shown in red on this page.
Notes:
If any parts are missing, add the missing parts to your Oracle CPQ site.
Make sure to activate BOM tables from Admin-BOM-BOM Tables and Associate/Map them with respective tables.
45
Deploy the Home Page
Deploy the Oracle CPQ Home page to make the CPQ FOM Demo Package available on the Oracle CPQ Home page.
2. Select Home Page under Styles and Templates. The Home Page Setup page opens.
3. Verify that the Product Family definition is accurate in the Home page:
a. Expand ATO.
b. Select the Model Punch-in icon next to ATO-L. The Model Punch-ins List opens.
c. Make sure the model exists in the Model Punch-ins List. If it does not exist, add it.
5. Click Deploy.
46
Order Management Pricing Integration
Standard item, configurable item, and subscription item pricing are derived using the pricing engine in CPQ.
Enable Pricing
Perform the following steps in Oracle CPQ to enable Pricing.
3. Set the Apply only the first matching Pricing profile option to No.
6. Set the Commerce Pricing Behavior option to the latest version (e.g. Version 3).
7. Click Update
Charges
The following two charges are supported by the Order Management integration solution:
Notes:
Pricing for One Time charges and Recurring changes is calculated as unit price x quantity.
User BOM rules to model the charge structure for products in the Order Management integration solution.
For the Order Management integration solution to work, product items must be added as parts under the Model.
Adjustments
There can be multiple auto adjustments and multiple manual adjustments on One-Time and Recurring charges.
Auto Adjustments: These are defined in pricing data tables by CPQ Admins. Sales users cannot change these adjustments.
Manual Adjustments: Filled by sales users at the time of quoting process.
1
Pricing Engine Setup
The following Order Management Pricing-related configuration is deployed by default with the Oracle Order Management package.
Pricing Definitions are stored in the following data tables.
ORCL_PRC_BASE_CHGS
This data table stores the charge-related information. The price definition of each products needs to be added to this table.
Periodicity: Periodicity determines the frequency at which billing invoice is available for each charge type.
TierType: If the Recurring Usage Charge is designated as Tiered, it can be set as ORA_ALL_TIERS or ORA_HIGHEST_TIER.
By default the pricing profile is set to ORA_ALL_TIERS. The default can be modified to ORA_HIGHEST_TIER pricing profile.
ORCL_PRC_ADJUSTMENTS
This data table stores the automatic adjustment data for each part. Automatic adjustments that are defined as part of the price
definition are added to this data table.
Charge_Type: The charge type of the charge on which the adjustment is applied
2
Pricing Profile Configuration
Profile Name: FOM Charges. The Order Management Charges pricing profile filters the list of products by pricing profile action.
Add the parts for which you want to see the charges
3
Profile BML: Profile Action is associated to Advanced BML. This BML is associated to the profile action and contains the logic for
price calculation. Administrators can customize the BML logic to change the pricing logic.
Profile BML invokes the oRCL_fOM_oraclePricingFOMIntegration utility BML. This returns the JSON calculation information that
provides all the charge information.
Script:
4
Pricing Related Utility BML
The following Utility BMLs are used by FOM Pricing. The BML scripts are available in Appendix F: Pricing Related Utility BMLs.
Allowance
oRCL_allowance Allowance for the charges
Unit Price
oRCL_unitPrice Unit Price of the item. For recurring charge, it
represents price per period.
List Price
oRCL_listPrice List Price of the item
For One time charge:
listPrice = unitPrice * quantity
For Recurring charges:
listPrice = unitPrice * periods * quantity
Charge Type
oRCL_chargeType Charge Type of the item ORA_ONE_TIME
ORA_RECURRING
Periodicity
oRCL_periodicity Periodicity if the charge type is recurring DAY [ DY]
WEEK [0zH]
MONTH[0zG]
QUARTER[0zF]
YEAR[0zE]
BlockSize
oRCL_blockSize Block size for the charge
5
Attribute Name Variable Name Description Expected Value
Tier Type
oRCL_tierType If the Recurring Usage Charge is designated as
Tiered, it can be set as ORA_ALL_TIERS or
ORA_HIGHEST_TIER.
By default the pricing profile is set to
ORA_ALL_TIERS.
The default can be modified to
ORA_HIGHEST_TIER in the pricing profile.
Note: Recurring Usage is not supported in Oracle
CPQ 21B
Net Price
oRCL_netPrice Net Price of the item
For One time charges: NetPrice =
(unitPrice – adjustments) * quantity
For Recurring charges: NetPrice =
(unitPrice – adjustments) * periods * quantity
Sequence
oRCL_chargeSequenceNumber Sequence number of the charges
Number
Unit Net Price
oRCL_unitNetPrice Unit Net Price of the item
For One time charges: NetPrice =
(unitPrice – adjustments)
For Recurring charges: NetPrice =
(unitPrice – adjustments) * periods
Apply To
oRCL_applyTo On which type of price it is applied Price Shipping
Unit Manual
oRCL_manualAdjustment Calculates the unit manual adjustment
Adjustment unitAutoAdjustment = Sum of manual
adjustments
Periods oRCL_periods Periods is considered only for recurring charges.
Period is derived based the contract start date
and contract end date and the periodicity
Total Manual
oRCL_totalManualAdjustment Total Manual Adjustment of the item
Adjustment For One time charges:
total Manual Adjustment = sum of the
manual adjustment * quantity
For Recurring charges:
total Manual Adjustment = sum of the
manual adjustment * quantity * periods
Primary Charge oRCL_primaryCharge Primary charge is used to determine whether the true / false
charge is primary or not.
6
Auto Adjustment Array
Auto Adjustment array is used to hold the auto adjustments provided for a particular charge type. The following attributes are added
in the array set.
7
Manual Adjustment Array
Manual Adjustment array is used to hold the manual adjustments provided for a particular charge type. The following attributes are
added in the array set.
ATTRIBUTE
VARIABLE NAME DESCRIPTION EXPECTED VALUE
NAME
8
Notes:
Though there are certain attributes with Tier pricing in Charges but these are not supported in this release.
Recurring Usage Charge type is not supported.
However customer can extend the functionality by making use of these attributes.
Roll Up Charges
Roll Up charges are sum of the unit recurring and non-recurring and net recurring and non-recurring charges. The total is displayed
in the line level attribute.
The attributes used for calculating the roll up charges.
Roll Up charges are calculated when the transaction is loaded and when Save action is performed. The following BML is used to
calculate the Roll Up charges.
9
Script:
returnString = "";
document_number = documentNumber;
unitPriceNonRecurring = 0.0;
netPriceNonRecurring = 0.0;
unitPriceRecurring = 0.0;
netPriceRecurring = 0.0;
chargesSize = string[jsonarraysize(charges)];
count = 0;
for ch in chargesSize {
charge = jsonarrayget(charges,count,"json");
chargeType = jsonget(charge,"chargeType");
unitPrice = jsonget(charge,"unitPrice", "float");
netPrice = jsonget(charge,"netPrice", "float");
if(chargeType == "ORA_ONE_TIME") {
unitPriceNonRecurring = unitPriceNonRecurring + unitPrice;
netPriceNonRecurring = netPriceNonRecurring + netPrice;
} else {
unitPriceRecurring = unitPriceRecurring + unitPrice;
netPriceRecurring = netPriceRecurring + netPrice;
}
count = count + 1;
}
returnString = returnString +"|"+ document_number+"~unitPriceNonRecurring_l~" +
string(round(unitPriceNonRecurring,2));
returnString = returnString +"|"+ document_number+"~netPriceNonRecurring_l~" +
string(round(netPriceNonRecurring,2));
returnString = returnString +"|"+ document_number+"~unitPriceRecurring_l~" +
string(round(unitPriceRecurring,2));
returnString = returnString +"|"+ document_number+"~netPriceRecurring_l~" +
string(round(netPriceRecurring,2));
return returnString;
10
Oracle CPQ Account Integration
This section identifies the library functions that support account integration and the manual changes that administrators must make
to the INT_SYSTEM_DETAILS Data Table and the INT_SYSTEM_TEMPLATES Data Table to support account integration.
Note: For more details about Account Integration with Oracle Customer Data Management (CDM), refer to CPQ-CDM
Integration Whitepaper on My Oracle Support under CPQ to Fusion Financials Integration (Doc ID 2012010.1).
Library Functions
The library functions within this section support the CDM integration by retrieving account details.
Queries the template location from the INT_SYSTEM_TEMPLATES Data Table based on the system and operation.
This is a Commerce library function.
The Return Type, input information, and attributes used by this library function are shown in the following image.
This is a Commerce library function that invokes Web Services and returns the response.
The Return Type, input information, and attributes used by this library function are shown in the following image.
11
Manual Data Table Changes
The INT_SYSTEM_DETAILS and INT_SYSTEM_TEMPLATES data tables are added to the CPQ site for account integration.
INT_SYSTEM_DETAILS
TCA-OrgService <Enter the username here to call <Enter the web service endpoint to call TCA Find Organization details
the web service endpoint> the service related to TCA>
TCA-AccService <Enter the username here to call <Enter the web service endpoint to call TCA customer Account
the web service endpoint> the service related to TCA>
As shown in the following image, administrators must manually select the Key option for the System column.
INT_SYSTEM_TEMPLATES
TCA-AccService FindAcc <Enter the template URL path that is uploaded in File Manager>
As shown in the following image, administrators must manually select the Key option for the System and Operation columns.
12
Add Template Dependencies to File Manager
Oracle CPQ administrators must add the Find Organization payload template file and the Customer Account payload template file to
File Manager. These template files support account integration.
Perform the following steps to add the template dependencies to File Manager.
3. Navigate to File Manager under Utilities category and create a new folder named TCA.
4. Click Browse under Add Files. The Choose File to upload dialog opens.
Note: To view the BML included in the payload template files, refer to Appendix G: Payload Template Files.
13
Appendix A: Create Order
4. Open the Transaction Line Details page for a transaction line item, and then edit the line details.
14
5. Navigate to Transaction Line Details > Charges, then verify and add Adjustments as required.
7. Click Save.
9. Order Number, Order Status, and Fulfilment Id for each line are returned from Order Management on successful creation of order.
Note: Use Oracle Order Management to check the order creation using returned Order Number.
15
Appendix A2: Create Order – Configurable Item Workflow
Perform the following steps in Oracle CPQ to create a configurable item order.
4. Click Update. This will display optional class available for the root model.
5. Click Create Transaction. This will create new transaction with the configurable items.
16
6. Edit the line details under Transaction Line Details > Charges. Net Price will be displayed based on the Adjustments applied.
Discounts are based on the adjustments mentioned in the data tables.
7. Manual Adjustments can be added in the charges, and then click Save. This will update the Net Price.
8. Edit the Transaction and Transaction Line details as required.
9. Click Save.
11. The Order Number, Order Status, and Fulfilment Id for each line are returned from Order Management on successful
creation of order.
Notes:
Use Order Management to check the order creation using the returned Order Number.
BOM setup is required for the configuration.
17
Appendix B: Auto Sync Status Workflow
Oracle Order Management allows customers to configure Business Events to be raised during various stages of fulfilment.
We subscribe to these Business events through OIC integrations and invoke CPQ REST APIs to update vital information.
This functionality synchronizes the Order and Order Line status from Order Management to CPQ.
3. Click Create Order to create an order in Order Management. Refer to Appendix A1: Create Order.
4. Use Order Management to check the order creation using the Order Number returned on order creation.
5. When the Order/ Order Line status changes on Order Management, it should reflect the updated Status attribute in CPQ
based on Order Status Mapping in OIC. Refer to Appendix I: CPQ-OM Status Mapping.
6. If the line status in CPQ is one of the values in ‘Trigger Update Asset for Line Status’, the Update Asset functionality will also
be triggered and Fulfilment Status will be updated to ‘Fulfilled’.
7. Open the Subscription Workbench page and observe the asset is created for the Fulfilled lines.
18
Appendix C: Cancel Order Workflow
This work flow support the cancellation of full order (all lines) and partial order (selected line items).
7. After the cancellation action is complete, verify the line item status is updated to Cancellation Requested or Cancelled.
19
Appendix C2: Partial Order Cancellation
1. Navigate to the commerce and open the transaction in which order was created.
5. (Optional) Select a cancellation reason for each of the lines to be cancelled in the Line Item Grid.
7. After the cancellation action is complete, verify the status is updated to ‘Cancellation Requested’ or ‘Canceled’
for the selected lines.
Notes:
Cancellation is not allowed for line with status such as ‘BILLED’, “SHIPPED’, ‘ACTIVATED’, ‘FULFILLED’, ‘AWAIT_BILLING’,
’DELIVERED’, ’AWAIT_ASSET_CREATION’, ‘SHIPPED’ etc.
20
Appendix D: Commerce Attributes
Bill To Site Use Id billToSiteUseId_t Text Customer bill-to Site use identifier.
Transaction bs_id Text Current Unique Buy-side ID. This is the internal
Internal ID identifier for a transaction within a CPQ site.
Cancel Reason cancelReason_t Menu The reason expressed by the customer for canceling
this order. The reason is selected by the sales user
from a list of standard values for the site.
Created Date createdDate_t Date The date when the transaction was created.
Create Order createOrderRestResponse Text Area This attribute holds the rest response of
REST Response create order.
Currency currency_t Menu The currency used to price and invoice this
transaction.
Customer Party ID customerPartyID_t Text The Party ID for the CRM Customer. This attribute is
used when a generalized Party object is used to
identify customer parties in addition to the
Customer ID.
Customer customerPartySiteID_t Text The ID for the Party Site or Address of the CRM
Party Site ID Customer.
Freeze Price Flag freezePriceFlag_t Boolean Contains one of the following values: true or false. If
true, then price the sales order. If false, then do not
price. The default value is true.
21
Attribute Name Variable Name Type Description
Invoice To Party ID invoiceToPartyID_t Text The Party ID for the Invoice To Customer. This
attribute is used when a generalized Party object is
used to identify customer parties. The Invoice To
Party may differ from the CRM Customer and Sold
To Parties.
Invoice To invoiceToPartySiteID_t Text The ID for the Party Site or Address of the Invoice To
Party Site ID party.
CPQ Source oRCL_ERP_CPQSourceSystemCode_t Text The code used in the integrated ERP system to
System Code identify CPQ as the source for order transactions.
Order Number oRCL_ERP_OrderNumber_t Text The order number assigned by the external Order
Management and ERP system.
Partial Ship Allowed oRCL_ERP_PartialShipAllowed_t Boolean Indicates whether partial shipment of the requested
quantity is acceptable to the customer.
Order Key orderKey_t Text Value that uniquely identifies the sales order. This
value is derived by concatenating the value of
SourceOrderSystem, a colon, and the value of
SourceOrderId.
Packing Instructions packingInstructions_t Text Text that describes how to pack the item.
Party Id partyId_t Text CDM integration will provide value to this field based
on Customer company name.
Payment Terms paymentTerms_t Menu The payment terms the customer will receive on
their invoice.
Transaction Name transactionName_t Text The number or public unique identifier of the
transaction.
Transaction Type transactionTypeCode_t Menu Abbreviation that identifies the type of transaction.
Code A list of accepted values is defined in the Order
Management lookup type
ORA_DOO_ORDER_TYPES.
Trigger Update triggerUpdateAssetForLineStatus_t Text List of line.status_l values which indicate that line
Asset for Line has finished processing on Order Management and
Status is ready to move to asset in CPQ (pending other
lines' status within same root).
22
Attribute Name Variable Name Type Description
Customer _customer_t_last_name Text Array Attribute in Additional Address Set. Last Name
Last Name of the contact person.
Invoice To _invoiceTo_t_company_name Text Company Name of the organization being billed for
Company Name this transaction.
Ship To Address _shipTo_t_address Text First Line of the Address of the organization where
this transaction will be shipped.
Ship To City _shipTo_t_city Text City of the organization where this transaction will
be shipped.
Ship To Country _shipTo_t_country Text Country of the organization where this transaction
will be shipped.
Ship To Zip _shipTo_t_zip Text Zip Code of the organization where this transaction
will be shipped.
Ship To State _shipTo_t_state Text State or Province of the organization where this
transaction will be shipped.
23
Appendix D1: Sub-Document (e.g. Transaction Line) Attributes
Attribute Name Variable Name Type Description
Associated Order Id associatedOrderId_l Text Source order Id associated with the subscription line
(For future use)
Cancel Reason cancelReason_l Menu The value must be same as defined in the Order
Management lookup type DOO_RETURN_REASON.
Change Code changeCode_l Menu A single select menu to handle all the possible
codes to close a subscription. (For future use)
Possible values (variable names in parentheses):
Full (ORA_FULL)
Prorate Without Credit
(ORA_PRORATE_WITHOUT_CREDIT)
Prorate With Credit
(ORA_PRORATE_WITH_CREDIT)
Change Reason changeReason_l Menu A single select menu to handle all the possible
reasons for closing a subscription. (For future use)
Possible values (variable names in parentheses):
Breach (ORA_BREACH)
Non-Compliant (ORA_NON_COMPLIANCE)
Quantity Change (ORA_CHANGE_QUANTITY)
Downgrade (ORA_DOWNGRADE)
Term Change (ORA_TERM_CHANGE)
Upgrade (ORA_UPGRADE)
Charge Hierarchy chargeHeirarchy Read-only This field is read-only and displays the charge
text or HTML hierarchy associated to the subscription line.
Contract Start Date contractStartDate_l Date Date that the customer starts to receive the service.
Contract End Date contractEndDate_l Date Date that the customer stops to receive the service.
Fulfillment Line Id fulfillmentLineId_l Text Value that uniquely identifies the fulfillment line.
Fulfillment Status fulfillmentStatus_l Menu The status for this line supplied by the fulfillment
system after the transaction is submitted as a sales
order.
24
Attribute Name Variable Name Type Description
Net Price netPriceNonRecurring_l Float Roll Up Net Price for all onetime items
Non-Recurring
Net Price Recurring netPriceRecurring_l Float Roll Up Net Price for all recurring items
Unit Price unitPriceNonRecurring_l Float Roll Up unit Price for all onetime items.
Non-Recurring
Unit Price Recurring unitPriceRecurring_l Float Roll Up unit Price for all recurring items.
Action Code oRCL_ABO_ActionCode_l Menu Indicates the changes required by the transaction
line.
Packing Instructions oRCL_ERP_PackingInstr_l Text Packing Instructions for the order line.
Ship Set oRCL_ERP_ShipSet_l Text The shipping set in which this order line will be
included.
Parent Document parentDocNumber_l Text Document number of the parent line item.
Number
Payment Terms paymentTerms_l Menu Payment terms to apply to collect payment. Review
and update the value for this attribute using the
Setup and Maintenance work area, and the Manage
Receivables Payment Terms task. To collect data for
this attribute, use the Collect Order Reference Data
task for Fusion Source.
Transaction transactionCategoryCode_l Menu Brief text that identifies the transaction category.
Category Code ORDER. Process a new source order.
RETURN. Process a return of an existing
sales order.
Block Allowance oRCL_pRC_blockAllowance Integer Pricing attribute to store the block allowance.
(For future use)
25
Attribute Name Variable Name Type Description
Block Size oRCL_pRC_blockSize Integer Pricing attribute to store the block size. Charge
line’s block size. Usually a static value defined as a
Line attribute in BOM attribute table.
(For future use)
Quantity UOM oRCL_pRC_quantityUOM Text Unit of measures for the priced quantity.
TierType oRCL_pRC_tiertype_l Menu Pricing attribute to store the Tier type. If the
Recurring Usage Charge is designated as Tiered, it
can be set as ORA_ALL_TIERS or
ORA_HIGHEST_TIER. By default ORA_ALL_TIERS is
supported for the pricing profile. The default can be
modified to ORA_HIGHEST_TIER pricing profile.
(For future use)
Unit List Price oRCL_pRC_unitListPrice Currency Pricing attribute to store the unit list price.
Unit Net Price oRCL_pRC_unitNetPrice Currency Pricing attribute to store the unit net price.
Use Usage Lock oRCL_pRC_useUsageLock Boolean This field indicates whether there is a Price
Override. If there is a Price Override, then the price
in the Create Subscription payload is required for
pricing the subscription. (For future use)
Tier Information oRCL_pRC_tierInfo Array Set Array set which with contain attributes to hold the
tier information. (For future use)
Auto Adjustments oRCL_autoAdjustments Array Set Displays the list of adjustments which are already
applied to the items. Refer to Pricing Engine Setup
for more details about the Auto Adjustment Array
set and the associated attributes.
Charges oRCL_charges Array Set Displays the list of charges associated to the items.
Refer to Pricing Engine Setup for more details about
the Charges Array set and the associated attributes
Manual Adjustments oRCL_manualAdjustments Array Set Displays the list of manual adjustments to be
applied on the items. Refer to Pricing Engine Setup
for more details about the Manual Adjustment
Array set and the associated attributes.
26
Appendix E: BML
retStr = "";
if (createOrderRestResponse < > "") {
for line in transactionLine {
if (line._line_bom_parent_id == "") {
retStr = retStr + line._document_number + "~fulfillmentStatus_l~BEING_FULFILLED|";
}
}
retStr = retStr + createOrderRestResponse;
}
return retStr;
The following BML is associated with Hide Create SO Action hiding rule.
count = 0;
for transaction in transactionLine{
count = count + 1;
break;
}
if (count == 0 OR orderKey_t < > "") {
return true;
}
return false;
27
Appendix E2: BML - Get Sales Order Status from FOM
This commerce library function is associated with Get Sales Order Status from FOM BML Integration which is associated with the
Get SO Status From FOM action.
Description Retrieves Status for Order Header and Order Lines. Calls ICS REST API to retrieve the status values.
28
Script:
//getSOStatusFromFOM
/////////////////////////////////////////
//Function Definition
//
// Imported MainDoc Attributes:
// "orderKey_t"
// Returns string - concatenation of docNum~AttributeVarName~AttributeValue strings
// in the format compatible with BML integration
29
Appendix E3: BML - Cancel Order
Cancel Order
This commerce library function is associated with Cancel Order BML Integration which is associated with Cancel Order action.
Description This function cancels an order or order lines in Order Management. This function is being
called from cancelSOFromCPQ commerce library function.
30
Script:
//Validation if the user has not selected any line item ,Throw an error
if(_system_selected_document_number=="")
{
throwerror("Select at least one line item(s) to cancel.");
}
//Spited the selected line item system attribute to find the selected line items by user
selectedLineArray=split(_system_selected_document_number, "~");
//Create an array to add all the status that can not be canceled
statusCanNotBeCanceled= String [8];
statusCanNotBeCanceled[0] ="AWAIT_BILLING";
statusCanNotBeCanceled[1] ="BILLED";
statusCanNotBeCanceled[2] ="DELIVERED";
statusCanNotBeCanceled[3] ="ACTIVATED";
statusCanNotBeCanceled[4] ="FULFILLED";
statusCanNotBeCanceled[5] ="DELETED";
statusCanNotBeCanceled[6] ="AWAIT_ASSET_CREATION";
statusCanNotBeCanceled[7] ="SHIPPED";
//Take string to add all the line number that can not be canceled
invalidLineItemSelected="";
index=0;
//Boolean variable to check if current product's root item is selected
isRootItemSelected=false;
//String to collect child line which root item are not selected
LonelyChildLineNumber="";
//Selected Cancelled line
selectedCancelledLine="";
// create the JSON array to add each line
lineJsonline = jsonarray();
for line in transactionLine{
//Increase the index for each line item
index=index+1;
//check if the user has selected the line
if(findinarray(selectedLineArray,line._document_number)>=0){
if (line._parent_doc_number == "") {
//current root item is selected
isRootItemSelected=true;
}elif(NOT(isRootItemSelected))
{ if(LonelyChildLineNumber==""){
LonelyChildLineNumber=LonelyChildLineNumber+string(index);
}else{
LonelyChildLineNumber=LonelyChildLineNumber+","+string(index);
}
}
/*Check if the line can be canceled based on line item status,if it can not be canceled add it
to invalid string or else add the document number to JSON array*/
if(findinarray(statusCanNotBeCanceled, line.status_l)>-1)
{
if(invalidLineItemSelected=="")
{
invalidLineItemSelected=""+string(index);
}
else{
invalidLineItemSelected=invalidLineItemSelected+","+string(index);
}
} //Validate if the selected line item is already canceled
31
elif( line.status_l=="CANCELED" OR line.status_l=="CANCEL_REQUESTED")
{
if(selectedCancelledLine=="")
{
selectedCancelledLine=""+string(index);
}
else{
selectedCancelledLine=selectedCancelledLine+","+string(index);
}
}
else{
jsonLineObject=json();
jsonput(jsonLineObject,"SourceTransactionLineId",line._document_number);
jsonput(jsonLineObject,"SourceTransactionScheduleId" ,line._document_number);
jsonput(jsonLineObject,"CanceledFlag" ,true);
jsonput(jsonLineObject,"CancelReasonCode" ,line.cancelReason_l);
jsonarrayappend(lineJsonline ,jsonLineObject);
}
}//Current root item is not selected
elif (line._parent_doc_number == "") {
isRootItemSelected=false;
}
}
if(invalidLineItemSelected<>"" AND LonelyChildLineNumber<>""){
throwerror("Below selected line item(s) can not be cancelled as one of more products are already
shipped: \n Line Number:"+invalidLineItemSelected+"\n The selected line item(s) can not be cancelled. Only
the root line item(s) can be cancelled. \n Line Number:"+LonelyChildLineNumber);
}
//If there is at least one line item selected that can not be canceled than throw error
if(invalidLineItemSelected<>"")
{
throwerror("Below selected line item(s) can not be cancelled as one of more products are already
shipped: \n Line Number:"+invalidLineItemSelected);
}
if(LonelyChildLineNumber<>"")
{
throwerror("The selected line item(s) can not be cancelled. Only the root line item(s) can be cancelled.
\n Line Number:"+LonelyChildLineNumber);
}
//Create JSON payload and include the order key ,cancellation reason code
jsonMainObject=json();
jsonput(jsonMainObject,"OrderKey",orderKey_t);
jsonput(jsonMainObject,"CancelReasonCode",cancelReason_t);
//Check if the user has selected all line item than send canceled Flag true at header level to cancel
whole order
if(index==sizeofarray(selectedLineArray))
{
jsonput(jsonMainObject,"CanceledFlag",true);
}else{
if(selectedCancelledLine<> "")
{
//Throw error message for canceled lines in case of partial cancellation
throwerror("The selected line item(s) are already cancelled/Cancellation Requested. \n Line
Number:"+selectedCancelledLine);
}
//Else add the line json array to the json payload
jsonput(jsonMainObject,"lines",lineJsonline);
}
//convert the JSON payload to String
32
payload=jsontostr(jsonMainObject);
print payload;
restResponse = dict("string");
headers = dict("string");
//Get connection details stored in Generic Integration - CancelSOFromCPQ
connectionInfo = bmql("select username,password,requestUrl from integration.genericIntegration where name
= 'CancelSOFromCPQ'");
icsUrl = "";
username = "";
password = "";
for info in connectionInfo{
username = get(info, "username");
password = get(info, "password");
icsUrl = get(info, "requestUrl");
}
auth = encodebase64(username+":welcome2");
//create request headers
headers = dict("string");
put (headers , "Authorization", "Basic "+auth);
put (headers , "Content-Type", "application/json");
put (headers , "Accept", "application/json");
// Call ICS Rest API
restResponse = urldata(icsUrl, "POST",headers,payload, 120000);
statusCode = get(restResponse,"Status-Code");
if(statusCode <> "200"){
if(statusCode =="-1"){
throwerror("The request is taking longer than usual. Cancellation has been requested for selected
line(s).");
}else{
throwerror("Some error occured");
}
}
resp = get(restResponse, "Message-Body");
ErrorString = commerce.parseResponse(resp, "error");
//If there is an error in response throw error
if( ErrorString <>"" )
{
throwerror(ErrorString );
}
// Request was successful, hence get the formatted concatenated string from response and return it.
return commerce.parseResponse(resp,"response");
33
Parse Response
The following BML is used in cancel order commerce library function to parse response.
Description This function is to parse the JSON response from Fusion .This function is being called from
cancelSOFromCPQ commerce library function.
Script:
jobj=json(response);
cpqresp = jsonget(jobj,Attribute);
return cpqresp;
34
Appendix E4: BML - Update Fulfillment Line Status
This commerce library function is associated with Update Fulfillment Line Status BML Integration. This BML loops through the quote
lines and change the fulfilment status (fulfillmentStatus_l) of Configuration Item (root only) or standard items to
‘AWAIT_ASSET_CREATION’ based on ‘Trigger Update Asset for Line Status’ (triggerUpdateAssetForLineStatus_t) attribute values.
35
Script:
37
Appendix E5: BML - Update Asset
This commerce library function is associated with Update Asset BML Integration. The BML loops through the all the quote lines with
fulfilment status as ‘AWAIT_ASSET_CREATION’ and create/update the asset in CPQ Asset Repository and changes the fulfilment
status (fulfillmentStatus_l) to ‘ FULFILLED.
Update Asset
38
Script:
39
jsonput(txn_json, PAYMENT_TERM, paymentTerm);
jsonput(txn_json, TRANSACTION_ID, _system_buyside_id);
//step3a formal processing
//processing for internal case.
//now we collect the list of lines need to update-asset
successString = "";
lineJsonArray = jsonArray();
for line in transactionLine {
if (NOT(line.status_l == DEACTIVATED OR line.fulfillmentStatus_l == AWAIT_ASSET_CREATION)) {
continue; //skip lines that are NOT awaiting asset creation or NOT Deactivated
}
if (line._line_bom_parent_id<>"") { //skip non-root line
continue;
}
if (line.itemInstanceId_l == "") { //skip non abo & non model line
continue;
}
lineJson = json();
jsonput(lineJson, DOCUMENT_NUMBER, line._document_number);
// for transaction date we will use db format within abo script,
// also for empty date we treat as today as of processing ime
transactionDate = line.requestDate_l;
if (transactionDate == ""
OR isnull(transactionDate)) {
transactionDate = datetostr(getDate(false), "yyyy-MM-dd HH:mm:ss");
} else {
tranDate = commerce.convertLibraryFunctionDateStringToDate(transactionDate);
transactionDate = datetostr(tranDate, "yyyy-MM-dd HH:mm:ss");
}
jsonput(lineJson, REQUEST_DATE, transactionDate);
jsonput(lineJson, ACTION_CODE, line.oRCL_ABO_ActionCode_l);
jsonput(lineJson, ITEM_INSTANCE_ID, line.itemInstanceId_l);
jsonarrayappend(linejsonArray, lineJson);
//also prepare the return string to update root lines when the updateAsset is successful
if (successString<>"") {
successString = successString + "|";
}
if( line.oRCL_ABO_ActionCode_l == "TERMINATE") {
successString = successString + line._document_number + "~fulfillmentStatus_l~" + CLOSED;
} else {
successString = successString + line._document_number + "~fulfillmentStatus_l~" + FULFILLED;
}
}
// now inovke utility to load line detail, transfer to bom, and aggregate open order,
// and generate delta action and invoke aset syc
// if updateAsset fail, expect the abo_updateAsset to throwerror from inside
response = util._ORCL_ABO.abo_updateAsset(txn_json, lineJsonArray);
if (successString<>"") {
successString = successString + "|";
}
print successString;
print "Update Asset completed";
return successString;
40
Appendix E6: BML – Save
This BML is associated with Advanced Modify - After Formulas for Save (cleanSave_t) action on transaction level.
41
Script
returnString = "";
for line in transactionLine {
if(((line.oRCL_pRC_useUsageLock == false OR line.oRCL_pRC_tierd_l == "N") AND
line._price_calculation_info <> "")) {
calcInfo = jsonarrayget(jsonarray(line._price_calculation_info),0,"json");
returnString = commerce.oRCL_populateFOMPrices(calcInfo, line.oRCL_manualAdjustments,
line.requestedQuantity_l, line._document_number);
} elif (line._part_number == "") {
tierFrom = integer[1];
tierListPrice = float[1];
startDate = strtojavadate(line.contractStartDate_l , "MM/dd/YYYY HH:mm:ss");
endDate = strtojavadate(line.contractEndDate_l , "MM/dd/YYYY HH:mm:ss");
calculationInfo = util.oRCL_fOM_oraclePricingFOMIntegration(line._model_name,
line.requestedQuantity_l, "", 0, 0, 0.0, tierFrom, tierFrom, tierListPrice, tierFrom, false, startDate,
endDate);
calcInfo = jsonget(calculationInfo, "calculationInfo", "json");
returnString = commerce.oRCL_populateFOMPrices(calcInfo, line.oRCL_manualAdjustments,
line.requestedQuantity_l, line._document_number);
}
}
return returnString;
42
Appendix E7: BML – Save (Line)
Advanced BML is Advanced Modify - After Formulas
Script:
43
Appendix E8: BML - Customer Details
The BML for the Customer Details action is used to support account integration. When sales users enter a customer company name
and click Customer Details, the BML retrieves the PrimaryPartyId, BillToAccountId, and BillToSiteUseId fields from the Oracle EBS
Customer Data Management application:
44
returnAccountNumber = "Check if customer company name is valid & also TCA service is up";
returnSiteNumber = "Check if customer company name is valid & also TCA service is up ";
return "1~accountNumber_t~"+returnAccountNumber+"|"+"1~billToSiteUseId_t~
"+returnSiteNumber +"|";
}
returnBillToSiteUseId="";
xpathsbilltositeuseid = string[1];
xpathsbilltositeuseid[0] =
"//ns2:Value/ns2:CustomerAccountSite/ns2:CustomerAccountSiteUse[ns2:SiteUseCode=‘BILL_TO’ and
ns2:PrimaryFlag=‘true’]/ns2:SiteUseId";
outputbilltositeuseid = readxmlsingle(customerAccountsoapResponse, xpathsbilltositeuseid);
if (containskey(outputbilltositeuseid ,xpathsbilltositeuseid[0])) {
returnBillToSiteUseId= get(outputbilltositeuseid,xpathsbilltositeuseid[0]); }
else {
returnBillToSiteUseId= "Check if customer company name is valid & also TCA service is up.";
}
xpathCustomerAccountSiteUse = string[1];
// get the XML Element called Customer AccountSiteUse where primary is true and use is BILL TO
xpathCustomerAccountSiteUse[0] =
"//ns2:Value/ns2:CustomerAccountSite/ns2:CustomerAccountSiteUse[ns2:SiteUseCode=‘BILL_TO’ and
ns2:PrimaryFlag=‘true’]";
outputCustomerAccountSiteUse = readxmlsingle(customerAccountsoapResponse, xpathCustomerAccountSiteUse);
returnSiteId ="";
if (containsKey(outputCustomerAccountSiteUse,xpathCustomerAccountSiteUse[0]))
{
CustomerAccountSiteUseXmlFragment = get(outputCustomerAccountSiteUse,xpathCustomerAccountSiteUse[0]);
xpath1 = string[1];
xpath1[0] = "//ns2:CustomerAccountSiteId";
output1 = readxmlsingle(CustomerAccountSiteUseXmlFragment,xpath1);
if (containsKey(output1,xpath1[0]))
{
returnSiteId = get(output1,xpath1[0]);
}
}
if (returnSiteId == "") {
returnSiteId = errorString;
}
partySiteId = "";
xpathCustomerAccountSite = string[1];
// get the XML Element called Customer AccountSite where ID = returnSiteId
xpathCustomerAccountSite[0] = "//ns2:Value/ns2:CustomerAccountSite[ns2:CustomerAccountSiteId=" +
returnSiteId + "]";
outputCustomerAccountSite = readxmlsingle(customerAccountsoapResponse, xpathCustomerAccountSite);
if (containsKey(outputCustomerAccountSite,xpathCustomerAccountSite[0]))
{
CustomerAccountSiteXmlFragment = get(outputCustomerAccountSite,xpathCustomerAccountSite[0]);
xpath2 = string[1];
xpath2[0] = "//ns2:PartySiteId";
output2 = readxmlsingle(CustomerAccountSiteXmlFragment,xpath2);
if (containsKey(output2,xpath2[0]))
{
partySiteId = get(output2,xpath2[0]);
}
if (partySiteId == "") {
partySiteId = errorString;
45
}
}
partySiteNumber = "";
xpathPartySiteNumber = string[1];
// get the XML Element called Customer AccountSite where ID = returnSiteId
xpathPartySiteNumber[0] = "//ns2:Value/ns2:PartySite[ns1:PartySiteId=" + partySiteId + "]";
outputPartySiteNumber = readxmlsingle(organizationSoapResponse, xpathPartySiteNumber);
if (containsKey(outputPartySiteNumber,xpathPartySiteNumber[0]))
{
PartySiteNumberXmlFragment = get(outputPartySiteNumber,xpathPartySiteNumber[0]);
xpath3 = string[1];
xpath3[0] = "//ns1:PartySiteNumber";
output3 = readxmlsingle(PartySiteNumberXmlFragment,xpath3);
if (containsKey(output3,xpath3[0]))
{
partySiteNumber = get(output3,xpath3[0]);
}
}
return "1~invoiceToPartyID_t~"+returnPartyId+"|1~partyId_t~"+returnPartyId+"|"+"1~accountNumber_t~"
+returnAccountNumber+"|"+"1~billToSiteUseId_t~"+returnBillToSiteUseId+"|"+"1~_customer_id~
"+returnPartyId+"|";
46
Appendix F: Pricing Related Utility BMLs
Oracle Pricing FOM Integration (oRCL_fOM_oraclePricingFOMIntegration): Calculates the price based models.
Script:
// This utility BML will calculate the price based on pricing model (Single or Tiered).
// Name: Oracle Pricing Subscription Base Profile
// Variable Name: oRCL_fOM_oraclePricingFOMIntegration
// Input:
// partNumber(String) - This is used to look up rows from the ORCL_PRC_BASE_CHGS table
// quantity(Integer) - Used for calculating the price.
// chargeName(String)
// lockedAllowance(Integer)
// lockedBlockSize(Integer)
// lockedListPrice(Float)
// tierFrom(Integer[])
// tierTo (Integer[])
// tierListPrice(Float[])
// tierBlockSize(Integer[])
// lockUsage(Boolean)
// Output:
// JSON - Includes UnitPrice and other JSON elements for Subscription Service.
// Dependency : Calculate List Price, Prepare Tier Info Json
lang = dict("string");
fields = dict("string");
where = "";
// If the chargeName is provided, query the data table for specific charges. otherwise queries all
charges.
if(isnull(chargeName) OR chargeName == ""){
put(fields, "$field1", partNumber);
where = "Product= $field1";
}else{
put(fields, "$field1", partNumber);
47
put(fields, "$field2", chargeName);
where = "Product= $field1 AND Charge= $field2";
}
for charge in charges { // Iterating throgh charges queried from data table ORCL_PRC_BASE_CHGS.
listPrice = 0.0;
unitPrice = 0.0;
unitListPrice = 0.0;
totalAutoAdjustment = 0.0;
periods = 0.0;
startDate = contractStartDate;
endDate = contractEndDate;
tierList = jsonarray();
// Reading the each charge details
tiered = get(charge, "Tiered");
chargeId = getint(charge, "Charge_Id");
product = get(charge, "Product");
chargeType = get(charge, "Charge_Type");
chargeNameValue = get(charge, "Charge");
periodicity = get(charge, "Periodicity");
tierType = get(charge,"TierType");
allowance = getint(charge, "Allowance");
applyTo = get(charge, "ApplyTo");
primaryCharge = get(charge, "Primary_Charge");
adjustedAmount = 0.0;
chargeJson= json();
if(tiered == "N"){ // Non tiered
// Checking charge is of type lockable, if yes and locked then calculating the price based on locked
values
if(chargeType == "ORA_RECURRING_USAGE" AND lockUsage) {
price = lockedListPrice;
blockSize = lockedBlockSize;
allowance = lockedAllowance;
}else{
price = getfloat(charge, "Price");
blockSize = getint(charge, "Block_Size");
}
48
// Calculating Unit Price
if(quantity <> 0){
unitPrice = listPrice / quantity;
}
}else{
if(tierType == "ORA_ALL_TIERS"){
prevMax = 0;
tierSeq = 1;
// Checking charge is of type lockable, if yes and locked then calculating the price based on locked
values
if(chargeType == "ORA_RECURRING_USAGE" AND lockUsage) {
tierSize= sizeofarray(tierFrom);
tierLoopArr = range(tierSize);
for tierNum in tierLoopArr{
tierMin = tierFrom[tierNum];
tierMax = tierTo[tierNum];
blockSize = tierBlockSize[tierNum];
tierPrice = tierListPrice[tierNum];
if(tierMax == 0 OR (tierMax >= quantity)){ // True if we are at the last row of the tier.
iterationQuantity = quantity - prevMax; // Get the quantity to charge for this tier.
if(iterationQuantity < 0){
iterationQuantity = 0;
}
}else{ // True if the tier still has more rows after first tier.
iterationQuantity = tierMax - prevMax; // Get the quantity to charge for this row.
}
prevMax = tierMax; // Set the previous max for the if statement above on the next loop.
tierSeq = tierSeq + 1; // Increment the tier sequence number for the next iteration of the loop.
if(tierMax <= 0){ // stop processing tiers if <= 0 since that is used as a max identifier
break;
}
}
}else{
// If tiered pricing then querying ORCL_PRC_BASE_TIERS data table to get the tier info.
tiers = bmql("select Tier_Min, Tier_Max, Block_Size, Price from ORCL_PRC_BASE_TIERS where
Charge_Id = $chargeId ORDER BY Tier_Min ASC");
49
for tier in tiers { // Iterating through tiers
// Reading the tier info
tierMin = getint(tier, "Tier_Min");
tierMax = getint(tier, "Tier_Max");
blockSize = getint(tier, "Block_Size");
tierPrice = getfloat(tier, "Price");
if(tierMax == 0 OR (tierMax >= quantity)){ // True if we are at the last row of the tier.
iterationQuantity = quantity - prevMax; // Get the quantity to charge for this tier.
if(iterationQuantity < 0){
iterationQuantity = 0;
}
}else{ // True if the tier still has more rows after first tier.
iterationQuantity = tierMax - prevMax; // Get the quantity to charge for this row.
}
prevMax = tierMax; // Set the previous max for the if statement above on the next loop.
tierSeq = tierSeq + 1; // Increment the tier sequence number for the next iteration of the loop.
if(tierMax <= 0){ // stop processing tiers if <= 0 since that is used as a max identifier
break;
}
}
}
}
if(tierType == "ORA_HIGHEST_TIER"){
tierSeq = 1;
// Checking charge is of type lockable, if yes and locked then calculating the price based on locked
values
if(chargeType == "ORA_RECURRING_USAGE" AND lockUsage) {
tierSize= sizeofarray(tierFrom);
tierLoopArr = range(tierSize);
for tierNum in tierLoopArr{
tierMin = tierFrom[tierNum];
tierMax = tierTo[tierNum];
blockSize = tierBlockSize[tierNum];
tierPrice = tierListPrice[tierNum];
if(tierMin <= quantity AND (tierMax >= quantity OR tierMax == 0)){ // True if we are at the last
row of the tier.
50
listPrice = listPrice + util.oRCL_fOM_calculateListPrice(quantity, allowance, blockSize,
tierPrice);
}
}else{
// If tiered pricing then querying ORCL_PRC_BASE_TIERS data table to get the tier info.
tiers = bmql("select Tier_Min, Tier_Max, Block_Size, Price from ORCL_PRC_BASE_TIERS where
Charge_Id = $chargeId ORDER BY Tier_Min ASC");
tierSeq = tierSeq + 1; // Increment the tier sequence number for the next iteration of the loop.
}
}
}
}
periods = util.oRCL_fOM_calculatePeriod(startDate, endDate, periodicity, chargeType);
unitNetPrice = util.oRCL_fOM_calculateAutoAdjustments(product, chargeNameValue, unitListPrice,
chargeType, periodicity, periods);
netPrice = unitNetPrice * quantity;
51
sequenceNumber = sequenceNumber + 1;
unitAutoAdjustment = util.oRCL_fOM_calculateUnitTotalAutoAdjustment(product, chargeNameValue,
unitListPrice);
totalAutoAdjustment = util.oRCL_fOM_calculateTotalAutoAdjustment(product, chargeNameValue,
unitListPrice, periods, chargeType, quantity);
if(chargeType == "ORA_RECURRING" OR chargeType == "ORA_RECURRING_USAGE") {
listPrice = listPrice * periods;
unitListPrice = unitListPrice * periods;
}
52
Script:
//Name : PostDefaultOnLineItemSM
//Variable Name : oRCL_sm_postDefaultOnLineItem
//Description:This BML is used for populating root asset Key, auto adjustments and charges for lines.
//Invoked from sub doc ->Advanced Default->After formula
//Imported Sub doc attributes : _part_number, _document_number,oRCL_pRC_useUsageLock,
_price_calculation_info
//Input Parameters:
// "lineHierInfo" - dict("anytype"); result of AboBuildLineItemHierarchy execution
// Output: String
// Dependency : None
returnString = "";
docNumToRootDocNum = get(lineHierInfo, "DocNumToRootDocNum", "dict<string>");
docNumToAttrs = get(lineHierInfo, "DocNumToAttrs", "dict<anytype>");
//populate rotAssetKey_l
rootAssetKey="";
if(containskey(docNumToRootDocNum , line._document_number)){
rootDocNumber = get(docNumToRootDocNum, line._document_number);
lineAttrMap = get(docNumToAttrs, rootDocNumber ,"dict<string>");
}
if(isnull(rootAssetKey) OR rootAssetKey == ""){
//Simple product case
if ( len(line._model_variable_name) < 1 AND len(line._parent_doc_number) < 1 AND
len(line._line_bom_id) > 1 ){
lineAttrMap = get(docNumToAttrs, line._document_number ,"dict<string>");
rootAssetKey = get(lineAttrMap, "itemInstanceId_l" );
}
}
returnString = returnString +"|"+ line._document_number+"~rootAssetKey_l~"+rootAssetKey;
}
return returnString;
54
The Post Default on Line Item FOM BML internally calls the following BMLs.
Script:
// Populate the charges array and tierInfo arrays from calculated info
//charges, documentNumber
//util.oRCL_fOM_populateTiers(tierList, documentNumber)
returnString = "";
chargesArray = jsonArray();
chargesSize = jsonarraysize(charges);
itr = string[chargesSize];
chargecount=0;
for i in itr {
charge = jsonArrayget(charges, chargecount, "json");
chargecount = chargecount + 1;
chargeJson = json();
jsonput(chargeJson,"oRCL_chargeName",jsonget(charge,"chargeName","string"));
jsonput(chargeJson,"oRCL_chargeType",jsonget(charge,"chargeType","string"));
if(jsonget(charge,"periodicity","string") <> ""){
jsonput(chargeJson,"oRCL_periodicity",jsonget(charge,"periodicity","string"));
}
if(jsonpathcheck(charge,"$.Allowance")){
jsonput(chargeJson,"oRCL_allowance",jsonget(charge,"Allowance","integer"));
}
if(jsonpathcheck(charge,"$.BlockSize")){
jsonput(chargeJson,"oRCL_blockSize", jsonget(charge,"BlockSize","integer"));
}
if(NOT(isnull(jsonget(charge,"unitPrice")))){
jsonput(chargeJson,"oRCL_unitPrice",jsonget(charge,"unitPrice","float"));
}
if(NOT(isnull(jsonget(charge,"listPrice")))){
jsonput(chargeJson,"oRCL_listPrice",jsonget(charge,"listPrice","float"));
}
if(NOT(isnull(jsonget(charge,"unitListPrice")))){
jsonput(chargeJson,"oRCL_unitListPrice",jsonget(charge,"unitListPrice","float"));
55
}
if(NOT(isnull(jsonget(charge,"netPrice")))){
jsonput(chargeJson,"oRCL_netPrice",jsonget(charge,"netPrice","float"));
}
if(NOT(isnull(jsonget(charge,"sequenceNumber")))){
jsonput(chargeJson,"oRCL_chargeSequenceNumber",jsonget(charge,"sequenceNumber","integer"));
}
if(NOT(isnull(jsonget(charge,"unitNetPrice")))){
jsonput(chargeJson,"oRCL_unitNetPrice",jsonget(charge,"unitNetPrice","float"));
}
if(NOT(isnull(jsonget(charge,"applyTo")))){
jsonput(chargeJson,"oRCL_applyTo",jsonget(charge,"applyTo","string"));
}
if(NOT(isnull(jsonget(charge,"manualAdj")))){
jsonput(chargeJson,"oRCL_manualAdjustment",jsonget(charge,"manualAdj","float"));
}
if(NOT(isnull(jsonget(charge,"autoAdj")))){
jsonput(chargeJson,"oRCL_autoAdjustment",jsonget(charge,"autoAdj","float"));
}
if(NOT(isnull(jsonget(charge,"periods")))){
jsonput(chargeJson,"oRCL_periods",jsonget(charge,"periods","float"));
}
if(NOT(isnull(jsonget(charge,"totalAutoAdj")))){
jsonput(chargeJson,"oRCL_totalAutoAdjustment",jsonget(charge,"totalAutoAdj","float"));
}
if(NOT(isnull(jsonget(charge,"totalManualAdj")))){
jsonput(chargeJson,"oRCL_totalManualAdjustment",jsonget(charge,"totalManualAdj","float"));
}
if(NOT(isnull(jsonget(charge,"primaryCharge")))){
jsonput(chargeJson,"oRCL_primaryCharge",jsonget(charge,"primaryCharge","boolean"));
}
tiered = "N";
if(NOT(isnull(jsonget(charge ,"tiered")))){
tiered = jsonget(charge ,"tiered", "string");
jsonput(chargeJson,"oRCL_tiered",tiered );
}else{
jsonput(chargeJson,"oRCL_tiered","N");
}
if(tiered == "Y") {
jsonput(chargeJson,"oRCL_tierType",jsonget(charge,"tierType"));
tierList = jsonget(charge, "tierList", "jsonArray");
if(isnull(tierList) == false){
returnString = util.oRCL_fOM_populateTiers(tierList, documentNumber);
}
returnString = returnString + "|" + documentNumber + "~oRCL_pRC_tierd_l~" + tiered + "|";
}
jsonarrayappend(chargesArray, chargeJson);
}
returnString = returnString + documentNumber + "~oRCL_charges~" + jsonarraytostr(chargesArray) + "|";
return returnString;
56
Convert Library Function Date String to Date (convertLibraryFunctionDateStringToDate)
Script:
CalculateRollUpCharges (calculateRollUpCharges)
Calculates roll up charges
57
Script:
returnString = "";
document_number = documentNumber;
unitPriceNonRecurring = 0.0;
netPriceNonRecurring = 0.0;
unitPriceRecurring = 0.0;
netPriceRecurring = 0.0;
chargesSize = string[jsonarraysize(charges)];
count = 0;
for ch in chargesSize {
charge = jsonarrayget(charges,count,"json");
chargeType = jsonget(charge,"chargeType");
unitPrice = jsonget(charge,"unitPrice", "float");
netPrice = jsonget(charge,"netPrice", "float");
if(chargeType == "ORA_ONE_TIME") {
unitPriceNonRecurring = unitPriceNonRecurring + unitPrice;
netPriceNonRecurring = netPriceNonRecurring + netPrice;
} else {
unitPriceRecurring = unitPriceRecurring + unitPrice;
netPriceRecurring = netPriceRecurring + netPrice;
}
count = count + 1;
}
returnString = returnString +"|"+ document_number+"~unitPriceNonRecurring_l~" +
string(round(unitPriceNonRecurring,2));
returnString = returnString +"|"+ document_number+"~netPriceNonRecurring_l~" +
string(round(netPriceNonRecurring,2));
returnString = returnString +"|"+ document_number+"~unitPriceRecurring_l~" +
string(round(unitPriceRecurring,2));
returnString = returnString +"|"+ document_number+"~netPriceRecurring_l~" +
string(round(netPriceRecurring,2));
return returnString;
58
Manual Adjustment Calculations
Manual adjustments are calculated during the Save action. This BML is invoked from the Save action
Advanced Default - After Formulas. This BML internally calls BML Populate Prices
59
Script:
returnString = "";
for line in transactionLine {
if(((line.oRCL_pRC_useUsageLock == false OR line.oRCL_pRC_tierd_l == "N") AND
line._price_calculation_info <> "")) {
calcInfo = jsonarrayget(jsonarray(line._price_calculation_info),0,"json");
print calcInfo;
returnString = commerce.oRCL_populateFOMPrices(calcInfo, line.oRCL_manualAdjustments,
line.requestedQuantity_l, line._document_number);
} elif (line._part_number == "") {
tierFrom = integer[1];
tierListPrice = float[1];
startDate = strtojavadate(line.contractStartDate_l , "MM/dd/YYYY HH:mm:ss");
endDate = strtojavadate(line.contractEndDate_l , "MM/dd/YYYY HH:mm:ss");
calculationInfo = util.oRCL_fOM_oraclePricingFOMIntegration(line._model_name,
line.requestedQuantity_l, "Sale Price", 0, 0, 0.0, tierFrom, tierFrom, tierListPrice, tierFrom, false,
startDate, endDate);
calcInfo = jsonget(calculationInfo, "calculationInfo", "json");
returnString = commerce.oRCL_populateFOMPrices(calcInfo, line.oRCL_manualAdjustments,
line.requestedQuantity_l, line._document_number);
}
}
return returnString;
60
Manual Adjustments are calculated based on the following BMLs
61
Script:
returnString = "";
charges = jsonget(calcInfo,"charges", "jsonArray");
chargesSize = string[jsonarraysize(charges)];
count = 0;
netPriceTotal = 0.0;
listPriceTotal = 0.0;
totalManualAdj = 0.0;
sumManualAdj = 0.0;
sumAutoAdj = 0.0;
manualAdjustments = manualAdjustment;
for ch in chargesSize {
charge = jsonarrayget(charges,count,"json");
netPrice = jsonget(charge,"unitNetPrice", "float");
listPrice = jsonget(charge,"listPrice", "float");
unitListPrice = jsonget(charge,"unitListPrice", "float");
unitNetPrice = jsonget(charge,"unitNetPrice", "float");
chargeName = jsonget(charge,"chargeName");
chargeType = jsonget(charge,"chargeType");
period = jsonget(charge,"periods", "float");
if(chargeType == "ORA_RECURRING" OR chargeType == "ORA_RECURRING_USAGE") {
listPrice = listPrice * period;
}
manualAdjSize = jsonarraysize(manualAdjustment);
if(manualAdjSize >= 1){
unitNetPrice = commerce.calculateManualAdjustment(unitListPrice/period , chargeName,
manualAdjustment, (unitNetPrice/period), chargeType, period);
}
netPrice = unitNetPrice * quantity;
netPriceTotal = netPriceTotal + netPrice;
listPriceTotal = listPriceTotal + listPrice;
jsonput(charge,"netPrice",netPrice);
jsonput(charge,"unitNetPrice",unitNetPrice);
unitManualAdj = commerce.calculateUnitManualAdjustment(unitListPrice/period, chargeName,
manualAdjustment);
jsonput(charge,"manualAdj", unitManualAdj);
totalManualAdj = commerce.calculateTotalManualAdjustment(unitListPrice/period, chargeName,
manualAdjustment, period, chargeType, quantity);
jsonput(charge,"totalManualAdj", totalManualAdj);
count = count + 1;
}
manualAdjustments = commerce.getChargeTypeForManualAdjustment(manualAdjustments, charges);
returnString = returnString + util.oRCL_fOM_populateCharges(charges, document_number) + "|";
returnString = returnString + document_number + "~oRCL_manualAdjustments~" +
jsonarraytostr(manualAdjustments) + "|";
returnString = returnString + commerce.calculateRollUpCharges(charges, document_number);
return returnString;
62
Calculate Unit Manual Adjustment (calculateUnitManualAdjustment)
Calculates the manual adjustment per unit.
Script:
totalAdjustment = 0.0;
index = 0;
manualAdjSize = string[jsonarraysize(manualAdjustment)];
for adj in manualAdjSize {
adjustment = jsonarrayget(manualAdjustment,index,"json");
if(chargeName == jsonget(adjustment,"oRCL_manual_adjustmentChargeName_l")) {
adjustedAmount = jsonget(adjustment,"oRCL_manual_adjustmentValue_l", "float");
adjustmentType = jsonget(adjustment,"oRCL_manual_adjustmentType_l");
if (adjustmentType == "ORA_DISCOUNT_PERCENT") {
adjustedAmount = fabs(adjustedAmount) * listPrice /100;
}
totalAdjustment = totalAdjustment + adjustedAmount;
}
index = index + 1;
}
return totalAdjustment;
63
Calculate Total Manual Adjustment (calculateTotalManualAdjustment)
Calculates total manual adjustments
Script:
totalAdjustment = 0.0;
index = 0;
manualAdjSize = string[jsonarraysize(manualAdjustment)];
for adj in manualAdjSize {
adjustment = jsonarrayget(manualAdjustment,index,"json");
if(chargeName == jsonget(adjustment,"oRCL_manual_adjustmentChargeName_l")) {
adjustedAmount = jsonget(adjustment,"oRCL_manual_adjustmentValue_l", "float");
adjustmentType = jsonget(adjustment,"oRCL_manual_adjustmentType_l");
adjustmentEffectivity = jsonget(adjustment,"oRCL_manual_adjustmentEffectivity_l");
adjustmentPeriod = 0;
if (adjustmentType == "ORA_DISCOUNT_PERCENT") {
adjustedAmount = fabs(adjustedAmount) * listPrice /100;
}
totalAdjustment = totalAdjustment + adjustedAmount;
64
Get Charge Type for Manual Adjustment (getChargeTypeForManualAdjustment)
Fetches the charge type from the charges and populates the charge Type in manual adjustment
Script:
manualAdjustments = manualAdjustment;
manualAdjustmentsSize = string[jsonarraysize(manualAdjustments)];
count = 0;
for adj in manualAdjustmentsSize {
adjustment = jsonarrayget(manualAdjustments,count,"json");
adjChargeName = jsonget(adjustment,"oRCL_manual_adjustmentChargeName_l");
adjChargeType = "";
chargesSize = string[jsonarraysize(charges)];
index = 0;
for ch in chargesSize {
charge = jsonarrayget(charges,count,"json");
chargeName = jsonget(charge,"chargeName");
if(adjChargeName == chargeName) {
chargeType = jsonget(charge,"chargeType");
jsonput(adjustment,"oRCL_manual_adjustmentChargeType_l",chargeType);
}
index = index + 1;
}
count = count + 1;
}
return manualAdjustments;
65
Appendix G: Payload Template Files
The BML associated with the payload template files referenced in Add Template Dependencies to File Manager follows.
findOrganizationPayload.txt
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body
xmlns:ns1="http://xmlns.oracle.com/apps/cdm/foundation/parties/organizationService/applicationModule/types/"
>
<ns1:findOrganization>
<ns1:findCriteria xmlns:ns2="http://xmlns.oracle.com/adf/svc/types/">
<ns2:filter>
<ns2:conjunction>And</ns2:conjunction>
<ns2:group>
<ns2:conjunction>And</ns2:conjunction>
<ns2:item>
<ns2:conjunction>And</ns2:conjunction>
<ns2:attribute>PartyName</ns2:attribute>
<ns2:operator>=</ns2:operator>
<ns2:value>{{customerCompanyName_t}}</ns2:value>
</ns2:item>
</ns2:group>
</ns2:filter>
</ns1:findCriteria>
<ns1:findControl xmlns:ns3="http://xmlns.oracle.com/adf/svc/types/">
<ns3:retrieveAllTranslations/>
</ns1:findControl>
</ns1:findOrganization>
</soap:Body>
</soap:Envelope>
66
customerAccountPayload.txt
<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://xmlns.oracle.com/apps/cdm/foundation/parties/customerAccountService/applicationModule/types
/" xmlns:ns2="http://xmlns.oracle.com/adf/svc/types/">
<soapenv:Body>
<ns1:findCustomerAccount>
<ns1:findCriteria>
<ns2:filter>
<ns2:conjunction>And</ns2:conjunction>
<ns2:group>
<ns2:conjunction>And</ns2:conjunction>
<ns2:item>
<ns2:conjunction>And</ns2:conjunction>
<ns2:attribute>PartyId</ns2:attribute>
<ns2:operator>=</ns2:operator>
<ns2:value>{{returnPartyId}}</ns2:value>
</ns2:item>
</ns2:group>
</ns2:filter>
</ns1:findCriteria>
<ns1:findControl>
<ns2:retrieveAllTranslations>false</ns2:retrieveAllTranslations>
</ns1:findControl>
</ns1:findCustomerAccount>
</soapenv:Body>
</soapenv:Envelope>
67
Appendix H: Miscellaneous Commerce Library Functions
The Oracle CPQ Order Management package adds several library functions to the Commerce process. This topic
provides the BML associated with each of the library functions.
68
Appendix I: CPQ-OM Status Mapping
CPQ Main Document Order Status
The CPQ - Order Management Package adds the following order status values to the main document (e.g. Transaction)
status_t menu attribute.
Draft DOO_DRAFT
Processing OPEN
Closed CLOSED
Deactivated DEACTIVATED
Closed CLOSED
Waiting WAITING
2. Select Integrations in the left side navigation panel, and then select Lookups.
69
8. Click on the Add Row icon (+) at the bottom of the mapping table to add a new mapping.
9. Add the FOM Status code in the ‘FOM-StatusCode’ column and CPQ status code in the ‘CPQ-StatusCode’ column.
11. A dialog window will open and list the integration which are using this lookup.
Record those integrations, and then reactivate these integrations to apply the changes.
70
Appendix J: OIC Integration - UPDATESOSTATUSFROMFOM
This integration uses Oracle ERP Cloud adapter to subscribe to order management Sales Order Notification business event.
There is a filter expression defined to subscribe to the events for only those orders that were originated from CPQ by specifying the
Source System ‘ORA_BM_CPQ’ in the filter expression.
In Order Management, Sales Order Notification business event is raised for an order each time any of the following condition occurs:
Whenever the above events are raised, this integration is invoked and quote header status and line status are updated in CPQ.
Additionally, if the quote line status matches any of the status in ‘Trigger Update Asset for Line Status’, the Update Asset action
REST API is invoked to create an Asset in CPQ Asset Repository and update the CPQ quote line Fulfillment Status.
To enable business events in Order Management for different Fulfillment Status of order orchestration process,
refer to the Order Management Setup section
Notes:
Fulfilment Status for which business events are enabled can only be synched back to CPQ.
Status mentioned in CPQ attribute ‘Trigger Update Asset for Line Status’ should have the business event enabled for
corresponding Fulfilment Status in Order management. Without this Asset cannot be created in CPQ.
The CPQ Integration User should have Read/Write permissions on the status attributes which are being updated through
this integration.
71
Appendix K: Retrieve OIC Integration Endpoint URL
Integration endpoints are required for defining the Generic Integration in the Integration Center for the cancel order and get order
status flows.
2. Select Integrations in the left side navigation panel, and then select Integrations.
5. Click on the Metadata URL link. A page will display with the Endpoint URL. Record the Endpoint URL.
72
Appendix L: Limitations and Troubleshooting
Perform the following steps to resolve issues with the Create Order action.
2. Select Integration Center under Integration Platform. The Integration Center opens.
7. Click Save.
To resolve this, either add a value in the status_l attribute or add mapping to the CPQ-FOM-LineStatusDVM lookup in OIC for that
status. Refer to Appendix I: CPQ-OM Status Mapping.
73
CONNECT WITH US
Call +1.800.ORACLE1 or visit oracle.com.
Outside North America, find your local office at oracle.com/contact.
This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual
property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify,
license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or de compilation of
this software, unless required by law for interoperability, is prohibited.
The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in
writing.
If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, then the following
notice is applicable:
U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on th e hardware, and/or
documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and
agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system,
integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and lice nse restrictions applicable to the
programs. No other rights are granted to the U.S. Government.
This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any
inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous
applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use.
Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications. Oracle and
Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or
registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of
Advanced Micro Devices. UNIX is a registered trademark of The Open Group.
This software or hardware and documentation may provide access to or information about content, products, and services from third parties. Oracle
Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services
unless otherwise set forth in an applicable agreement between you and Oracle. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or
damages incurred due to your access to or use of third-party content, products, or services, except as set forth in an applicable agreement between you and
Oracle.