<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bryan Thompson - Oracle Consultant &#187; Order Management</title>
	<atom:link href="http://www.bryanthompsononline.com/oracle/category/order-management/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bryanthompsononline.com/oracle</link>
	<description>A forum for sharing Oracle knowledge!</description>
	<lastBuildDate>Sun, 30 May 2010 15:56:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Enhanced Change Management Functionality to the IR/ISO Process</title>
		<link>http://www.bryanthompsononline.com/oracle/2010/05/29/enhanced-change-management-functionality-to-the-iriso-process/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2010/05/29/enhanced-change-management-functionality-to-the-iriso-process/#comments</comments>
		<pubDate>Sat, 29 May 2010 22:41:24 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[R12]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2010/05/29/enhanced-change-management-functionality-to-the-iriso-process/</guid>
		<description><![CDATA[In 12.1 and 12.1.2, Oracle has introduced long awaited improvements to the Internal Requisition/Internal Order (IR/ISO) process...]]></description>
			<content:encoded><![CDATA[<p>In 12.1 and 12.1.2, Oracle has introduced long awaited improvements to the Internal Requisition/Internal Order (IR/ISO) process.  As you may know, the Oracle IR/ISO has been a very rigid process, to the point where it has been deemed useless by many in the Oracle community.</p>
<p>One of the major downsides with using IR/ISO in 11i and the initial R12 releases was the change management process.  Once an IR is approved it is essentially locked down and cannot be updated thereafter.  Only cancelations were only allowed if the corresponding ISO was canceled.  So if required dates needed to be changed on the IR, the corresponding ISO and the IR itself would have to be canceled and recreated with the proper dates.  Terrible!</p>
<p>Additionally, changes to the ISO, which were restricted to cancelations and scheduled ship date changes, would not propagate automatically to the IR and would have to be done manually.  In my opinion this was a huge gap in functionality.  If cancelations or scheduled ship date changes were made to the ISO, and if the IR was not manually updated to reflect these changes, it would result in a conflicting supply/demand picture between the requesting and source organizations.   In other words, the requesting organization would still see the supply quantity or required date of the IR it originally requested, while the source organization would be planning to the revised demand quantity or scheduled ship date on the ISO.</p>
<p>However, in 12.1 Oracle has finally provided some improvements.  The “Improved Internal Requisition/Internal Order Change Management” functionality provides automated change control between the two transactions.  In this release, changes made to the ISO can now be automatically applied to the IR.  Better yet, the IR itself can also be modified after it has been approved, where changes are also propagated to the ISO.  Workflow notifications can also be setup to notify the requesting or supplying organizations of such changes.  No longer will there be a discrepancy between the IR and ISO!</p>
<p>Another nuisance of the IR/ISO process was that the changes to the IR or ISO could not be initiated from planning.  So if planning had recommendations to change or cancel an IR, this would have to be done manually.  Likewise, the ISO would also have to be manually updated to ensure both were in sync.</p>
<p>But in 12.1.2, Oracle has added integration between Advanced Supply Chain Planning (ASCP) and Purchasing to provide internal requisition management from the planner’s workbench.  The “Release Recommendations for Internal Requisitions” functionality now allows the planner to release scheduled date and cancelations changes to the IR.  This perfectly complements the change management functionality introduced in 12.1.</p>
<p>As a consultant who has seen the pain in implementing the IR/ISO process in the past, these are welcomed changes.  I would highly recommend any customers who are in need of an integrated supply chain solution to consider these releases.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2010/05/29/enhanced-change-management-functionality-to-the-iriso-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does Oracle provide approval capabilities?</title>
		<link>http://www.bryanthompsononline.com/oracle/2009/02/19/does-oracle-provide-approval-capabilities/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2009/02/19/does-oracle-provide-approval-capabilities/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 03:19:46 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Quote to Cash]]></category>
		<category><![CDATA[Quoting]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/?p=79</guid>
		<description><![CDATA[Well, it depends.  Generally speaking, Oracle provides capabilities to integrate approvals within your business process.   However, depending on the module and transaction these capabilities can vary.  As an Order to Cash expert, I want to bring some clarity to what the out-of-the-box approval capabilities are within the Quoting and Order Management modules, then go into some of the enhancements I’ve implemented in the past to improve the functionality in some of these areas.]]></description>
			<content:encoded><![CDATA[<p>Well, it depends.  Generally speaking, Oracle provides capabilities to integrate approvals within your business process.   However, depending on the module and transaction these capabilities can vary.  As an Order to Cash expert, I want to bring some clarity to what the out-of-the-box approval capabilities are within the Quoting and Order Management modules, then go into some of the enhancements I’ve implemented in the past to improve the functionality in some of these areas.</p>
<p><strong>Approvals in Quoting</strong></p>
<p>You may have heard of Oracle’s Approval Management (AME) module.  AME provides flexible, workflow-based approval capabilities and serves as a one-stop-shop for managing all fixed and dynamic approval hierarchies throughout Oracle EBS.</p>
<p>Lucky for you, the Quoting module is well integrated with AME functionality, allowing approval hierarchies to be dynamically built based on different types of transactional criteria such as operating unit, total quote amount, customer, etc.  Base approval lists can be built manually or can be associated with SQL statements to dynamically generate hierarchies based on employee data.  Quoting also provides security settings that allow skipping an approver in the hierarchy or bypassing the process entirely. </p>
<p>Needless to say, the tight integration between the Quoting and AME modules provides great out-of-the-box approval functionality that is likely to meet or exceed your business requirements.</p>
<p><strong>Approvals in Order Management</strong></p>
<p>I wish I could say the same about Order Management (OM).  Unfortunately, there’s no out-of-the-box integration between OM and AME.  Compared to Quoting, the approval capabilities are limited and inconsistent depending on what type of transaction you’re performing. </p>
<p>You’ve probably seen the Approver setups in the OM module by clicking on the “Approvals” button on the order type setup screen; however, these setups pertain only to Negotiations (OM’s version of quoting).  The configuration gives the impression that approval lists can be built for Fulfillment type transactions (orders), but Oracle hasn’t implemented these capabilities into any of the generic OM workflows.</p>
<p>Another setback with Approver setups in OM is that they’re assigned and dedicated to a transaction type.  This can cause issues if you have multiple facilities that each require their own set of approvers, but are under the same operating unit in Oracle and share the same set of order types.  The only work-around for this is to create a separate set of transaction types for each facility, but this can get ugly.  Additionally, the approval lists are fixed, sequential and do not provide any of the dynamic capabilities that are available in the AME module. </p>
<p>It gets worse for return transactions.  The capabilities are limited to only allowing individual approvals and not approval hierarchies.  The generic return workflows in OM refer to a profile option that allows storage for only one approver.</p>
<p><strong>Approval Enhancements</strong></p>
<p>As you can guess, most of the enhancements I’ve designed and implemented have been to compensate for the limited approval functionality in OM.  Generally there are two approaches, each varying in complexity and produce different results.</p>
<p>As low-cost alternative with quick turnaround, I’ve provided enhancements to the seeded order and return workflows that incorporate the Approver setups in OM.  I say “quick” because Oracle already provides the necessary nuts and bolts to easily “plug” in the approver functionality with minimal customization.  Though the solution is low cost and quick, the functionality will still not provide all the capabilities of the AME module as I mentioned earlier.  However, this may suit your business fine depending upon your requirements.</p>
<p>A fancier approach I’ve taken is to integrate OM with the Approvals AME module entirely.  This way all the capabilities I spoke of earlier in the Quoting module are also made available to OM.  From a technical standpoint it’s definitely more involved than the first enhancement I mentioned, but if your business requires the flexibility, it certainly can provide a great return on investment.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2009/02/19/does-oracle-provide-approval-capabilities/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pricing Qualifiers &#8211; How They Work and Creating Your Own Part II</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 18:30:16 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/</guid>
		<description><![CDATA[In my last Qualifier article, I delved into the inner workings of Qualifiers in Advanced Pricing by walking through a quick demo of how to setup a Qualifier to reference Descriptive Flexfield data on a sales order transaction. In this article, I'd like to touch on how some Qualifiers require more advanced PL/SQL techniques to retrieve transactional data. For example, the "Customer Party ID" is tied to QP_SOURCING_API_PUB.GET_PARTY_ID function call because the Party ID isn't stored directly in the G_HDR record structure. With that said, lets walk-thru the creation of a Qualifier that requires us to create our own PL/SQL function reference...]]></description>
			<content:encoded><![CDATA[<p>In my last Qualifier article, I delved into the inner workings of Qualifiers in Advanced Pricing by walking through a quick demo of how to setup a Qualifier to reference Descriptive Flexfield data on a sales order transaction. In this article, I&#8217;d like to touch on how some Qualifiers require more advanced PL/SQL techniques to retrieve transactional data. For example, the &#8220;Customer Party ID&#8221; is tied to QP_SOURCING_API_PUB.GET_PARTY_ID function call because the Party ID isn&#8217;t stored directly in the G_HDR record structure. With that said, lets walk-thru the creation of a Qualifier that requires us to create our own PL/SQL function reference.</p>
<p>Let&#8217;s say that we have a requirement to qualify Modifier discounts against specific customer account numbers. Oracle provides us with a Qualifier for a customer&#8217;s Party ID, but does not provide a Qualifier for account number &#8211; we&#8217;ll need our own custom API to accomplish this.</p>
<p>Before we start, let&#8217;s not forget that a sales order could have multiple customer&#8217;s associated with the transaction. Remember that we can have up to three customers on a sales order that represent the selling, billing, and shipping organizations (there are even more when factoring in deliver to and installed at, but for this example let&#8217;s focus on the main three). The business requirements behind the discount could determine that we only need one of the three, but let&#8217;s assume that discounts could be applied to any of the selling, billing, and shipping customers. Hence, we&#8217;ll need three Qualifiers to represent each.</p>
<p>Let&#8217;s start by navigating to Setup &gt; Attribute Management &gt; Contexts and Attributes to choose our Context and create our core Attribute information. Since this Attribute will be mapped to a value stored on the customer master record, it&#8217;s most appropriate to place our attribute under the Customer context.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual1.png" /></p>
<p>Next, let&#8217;s add three Attribute records under the Attributes block with the appropriate Codes, Names, and Descriptions that will represent our sold to, bill to, and ship to customer account numbers. I&#8217;ve also decided to use a seeded Customer Account Value Set to validate our attributes against a valid list of customer account numbers.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual2.png" /></p>
<p>Lastly, we&#8217;ll need to assign an available column. As in my previous example, I&#8217;d recommend selecting a column that is a distance away from the last column that is being used to avoid any conflicts (in case Oracle decides to introduce new qualifying attributes in the future).</p>
<p>Now let&#8217;s navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping to map our Customer Account attributes. Select Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type, choose Customer as the Context, and click the Link Attributes button.</p>
<p>Once the Link Attributes form is open, we&#8217;ll add three new records for our Attributes. Since customer information is stored on the header AND line detail of a sales order transaction, our Level will be Both, followed by Attribute Mapping as our Attribute Mapping Method since we&#8217;re going to be referencing a PL/SQL function to retrieve our customer account number values.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual3.png" /></p>
<p>After saving your changes, we&#8217;ll want to begin mapping all three attributes. Let&#8217;s start with the Customer Sold To Account Number by clicking on the corresponding record and clicking the Attribute Mapping button. Once the Attribute Mapping form appears, select the ONT reference record for Order Management.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual4.png" /></p>
<p>Since we indicate Both as our reference level, we&#8217;re required to provide mapping references for both the Header and Line Source setups. At this point we know that our Source Type will be a PL/SQL API for each, but now here comes the hard point &#8211; exactly what PL/SQL will enable us to retrieve the Customer Sold To Account Number?</p>
<p>Going back to our Customer Party ID example, we see that this Qualifier is mapped to an Oracle seeded function called QP_SOURCING_API_PUB.GET_PARTY_ID.</p>
<blockquote><p><span style="font-size: 8pt; font-family: Courier New">QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_HDR.sold_to_org_id) </span></p>
<p><span style="font-size: 8pt; font-family: Courier New">QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_LINE.sold_to_org_id)<br />
</span></p></blockquote>
<p>We&#8217;ll need to create our own similar function in order to retrieve the sold to customer account. At a table level, since the order header (OE_SALES_ORDER_LINES_ALL) and order lines (OE_SALES_ORDER_LINES_ALL) contain direct references to the sold to customer (SOLD_TO_ORG_ID), and since the customer account number is stored directly in the customer master view (HZ_CUST_ACCOUNTS), we can build an almost identical query compared to what the seeded Customer Party ID function.</p>
<p>So given the SOLD_TO_ORG_ID of the sales order transaction, we can create a function that accepts SOLD_TO_ORG_ID as a parameter and retrieves the customer account number. We&#8217;ll need to build our own package which includes this function, so I created a package called <span style="background-color: white">XQP_SOURCING_API_PU</span>B. This package will contain all of our custom functions needed to retrieve custom Qualifier values:</p>
<blockquote><p>              </p></blockquote>
<blockquote><p><span style="color: blue; font-family: Courier New; background-color: white">CREATE </span><span style="color: blue; font-family: Courier New; background-color: white">OR </span><span style="color: blue; font-family: Courier New; background-color: white">REPLACE </span><span style="color: blue; font-family: Courier New; background-color: white">PACKAGE </span><span style="color: blue; font-family: Courier New; background-color: white">BODY</span><span style="color: black; font-family: Courier New; background-color: white"> APPS</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">XQP_SOURCING_API_PUB </span><span style="color: blue; font-family: Courier New; background-color: white">AS</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_sold_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2</span><br />
<span style="color: blue; background-color: white">IS</span></p>
<p><span style="color: black; background-color: white">l_sold_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p>
<p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_sold_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_accounts</span><br />
<span style="color: blue; background-color: white">WHERE</span><span style="color: black; background-color: white"> cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_sold_to_org_id</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">BEGIN</span></p>
<p><span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_sold_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_sold_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_sold_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_sold_to_account_number</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">EXCEPTION</span><br />
<span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span></p>
<p><span style="color: blue; font-family: Courier New; background-color: white">END</span><span style="color: black; font-family: Courier New; background-color: white"> GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; font-family: Courier New; background-color: white">;</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> XQP_SOURCING_API_PUB</span><span style="background-color: white">;</span></p></blockquote>
<p>Let&#8217;s compile and confirm that our PL/SQL runs successfully. We need to also be sure to include the package specification before compiling the above source.</p>
<p>Now that we have our function, we need to complete our Attribute Mapping setup by including in the User Value field the PL/SQL reference to this function both in the Header and Line setups. Our function accepts the SOLD_TO_ORG_ID as a parameter, so by using the G_HDR and G_LINE record structures, we can pass this value as our parameter.</p>
<blockquote><p><span style="color: black; background-color: white">XQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">sold_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">XQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SOLD_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_LINE</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">sold_to_org_id</span><span style="background-color: white">)</span></p></blockquote>
<p>Finished! Let&#8217;s go to the Tools file menu and select &#8220;Build Attribute Mapping Rules&#8221; to confirm our setups are correct.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual5.png" /></p>
<p>We&#8217;ve successfully built our Sold To Customer Account Qualifier, but we still need separate PL/SQL functions for the customer bill to and ship to account Qualifiers. On the OE_ORDER_HEADERS_ALL and OE_ORDER_LINES_ALL tables we have a reference to the BILL_TO_ORG_ID and INVOICE_TO_ORG_ID columns, but these ID&#8217;s refer to the site usage records in HZ_CUST_SITE_USES. With that said, our queries for these functions will be slightly different than the sold to function.</p>
<blockquote><p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_ship_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2 </span><span style="color: blue; background-color: white">IS</span></p>
<p><span style="color: black; background-color: white">l_ship_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p>
<p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_ship_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_acct_sites </span><span style="color: blue; background-color: white">a,<br />
</span><span style="color: black; background-color: white">hz_cust_site_uses b</span><span style="color: blue; background-color: white">,<br />
</span><span style="font-size: 8pt; color: black; font-family: Courier New; background-color: white">hz_cust_accounts c</span><br />
<span style="color: blue; background-color: white">WHERE</span><br />
<span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_acct_site_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_acct_site_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_ship_to_org_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_code </span><span style="color: blue; background-color: white">= </span><span style="color: red; background-color: white">&#8216;SHIP_TO&#8217;</span><br />
<span style="color: blue; background-color: white">and </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_account_id</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">BEGIN</span><br />
<span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_ship_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_ship_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_ship_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_ship_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">EXCEPTION </span><span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span></p></blockquote>
<blockquote><p>              </p></blockquote>
<blockquote><p><span style="color: black; background-color: white" /><span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span><br />
<span style="color: black; background-color: white" /><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">FUNCTION</span><span style="color: black; background-color: white"> GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_invoice_to_org_id </span><span style="color: blue; background-color: white">IN </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">varchar2</span><br />
<span style="color: blue; background-color: white">IS</span></p></blockquote>
<blockquote><p><span style="color: black; background-color: white">l_invoice_to_account_number </span><span style="color: blue; background-color: white">varchar2(</span><span style="color: maroon; background-color: white">30</span><span style="color: blue; background-color: white">);</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">CURSOR</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">l_invoice_to_org_id </span><span style="color: blue; background-color: white">NUMBER)</span><br />
<span style="color: blue; background-color: white">IS</span><br />
<span style="color: blue; background-color: white">SELECT</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">account_number</span><br />
<span style="color: blue; background-color: white">FROM</span><span style="color: black; background-color: white"> hz_cust_acct_sites </span><span style="color: blue; background-color: white">a,<br />
</span><span style="color: black; background-color: white">hz_cust_site_uses b</span><span style="color: blue; background-color: white">,<br />
</span><span style="font-size: 8pt; color: black; font-family: Courier New; background-color: white">hz_cust_accounts c<br />
</span><span style="color: blue; background-color: white">WHERE </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_acct_site_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_acct_site_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> l_invoice_to_org_id</span><br />
<span style="color: blue; background-color: white">AND</span><span style="color: black; background-color: white"> b</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">site_use_code </span><span style="color: blue; background-color: white">= </span><span style="color: red; background-color: white">&#8216;BILL_TO&#8217;</span><br />
<span style="color: blue; background-color: white">and </span><span style="color: blue; background-color: white">a.</span><span style="color: black; background-color: white">cust_account_id </span><span style="color: blue; background-color: white">=</span><span style="color: black; background-color: white"> c</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">cust_account_id</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">BEGIN</span><br />
<span style="color: blue; background-color: white">OPEN</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">p_invoice_to_org_id</span><span style="color: blue; background-color: white">);</span><br />
<span style="color: blue; background-color: white">FETCH</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur </span><span style="color: blue; background-color: white">INTO</span><span style="color: black; background-color: white"> l_invoice_to_account_number</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">CLOSE</span><span style="color: black; background-color: white"> get_bill_to_account_number_cur</span><span style="color: blue; background-color: white">;</span><br />
<span style="color: blue; background-color: white">RETURN</span><span style="color: black; background-color: white"> l_invoice_to_account_number</span><span style="color: blue; background-color: white">;</span></p>
<p><span style="color: blue; background-color: white">EXCEPTION </span><span style="color: blue; background-color: white">WHEN </span><span style="color: red; background-color: white">OTHERS </span><span style="color: blue; background-color: white">THEN</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">RETURN </span><span style="color: blue; background-color: white">NULL;</span></p></blockquote>
<blockquote><p><span style="color: blue; background-color: white">END</span><span style="color: black; background-color: white"> GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="background-color: white">;</span></p></blockquote>
<p><span style="background-color: white" />Let&#8217;s also include these functions in our <span style="background-color: white">XQP_SOURCING_API_PU</span>B package and compile our functions.</p>
<p><span style="color: black">After confirming successful compilation, we can add similar function references in the Attribute Mapping setups for the Bill To Customer Account and Ship To Customer Account Qualifiers.<br />
</span></p>
<blockquote><p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">ship_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_SHIP_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_LINE</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">ship_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; background-color: white">(</span><span style="color: black; background-color: white">OE_ORDER_PUB</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">G_HDR</span><span style="color: blue; background-color: white">.</span><span style="color: black; background-color: white">invoice_to_org_id</span><span style="background-color: white">)</span></p>
<p><span style="color: black; font-family: Courier New; background-color: white">SCHQP_SOURCING_API_PUB</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">GET_INVOICE_TO_ACCOUNT_NUMBER</span><span style="color: blue; font-family: Courier New; background-color: white">(</span><span style="color: black; font-family: Courier New; background-color: white">OE_ORDER_PUB</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">G_LINE</span><span style="color: blue; font-family: Courier New; background-color: white">.</span><span style="color: black; font-family: Courier New; background-color: white">invoice_to_org_id</span><span style="color: blue; font-family: Courier New; background-color: white">)</span></p></blockquote>
<p><span style="color: black">Once we&#8217;ve entered the references into the User Value fields, let&#8217;s build the attribute mapping rules for each to confirm the setups are successful.<br />
</span></p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual6.png" /><br />
<span style="color: black"><br />
All finished! Now if you go to Modifier setup form, you should see Sold To Customer Account Number, Bill To Customer Account Number, and Ship To Customer Account Number as available Qualifiers under the Customer context.<br />
</span></p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/09/091208_1831_PricingQual7.png" /><br />
<span style="color: black"><br />
Without a doubt, the combination of Qualifier Attribute Mapping setups with PL/SQL creates flexible functionality for establishing how and when pricing Modifiers should be applied &#8211; empowering the implementer to meet the most complex of discounting and surcharge requirements.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/09/12/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own-part-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>R12 Order Management &#8211; What&#8217;s changed?</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 00:40:29 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[R12]]></category>
		<category><![CDATA[Technical]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/</guid>
		<description><![CDATA[Good question. I'm in the process of figuring this out myself. However, here are a few things I do know based on my research and my recent R12 engagement...]]></description>
			<content:encoded><![CDATA[<p>Good question. I&#8217;m in the process of figuring this out myself. However, here are a few things I do know based on my research and my recent R12 engagement.</p>
<p><strong>Multiple Operating Unit Access</strong> &#8211; In 11i, a responsibility could only be tied to a single operating unit. However, in R12, responsibilities can be assigned to one or more operating units by assigning the responsibility to a security profile. This is a great enhancement for businesses where users require multi-organization access.</p>
<p><strong>Credit Card Entry Enhancements </strong>- An additional field has been added to the order entry screen to capture the security code typically located on the back of a credit card. Additionally, the credit card number is encrypted at the database level and stored within the Payments (formally iPayments) module. I&#8217;ll put out a more detailed article that talks about the drastic changes to the iPayments module.</p>
<p><strong>Reoccurring Charges </strong>- Functionality has been added to the TSO (Telecommunications Service Ordering) module which allows reoccurring billings. This is perfect for subscriptions and other like services.</p>
<p><strong>Partial Period Revenue Recognition</strong> &#8211; A joint OM and AR enhancement, partial period revenue recognition is a set of new revenue recognition rules in AR which allow for revenue recognition on a daily basis. Previously in 11i revenue recognition could only be done on a monthly basis.</p>
<p><strong>Pay Now or Pay Later</strong> &#8211; Upfront billing in Order Management can now be done and can be configured based on pricing charges, taxes, deposits, installment billing, and prepayments.</p>
<p><strong>Mass Scheduling Changes</strong> &#8211; The scheduling concurrent request can now pick up lines that have errored in the scheduling workflow activity. It also can now pick up lines that are in Entered status &#8211; both converted and manually entered orders.</p>
<p><strong>Customer Acceptance Process </strong>- Oracle R12 now provides the ability to introduce a customer acceptance step prior to invoicing. By setting up a deferral reason in AR, invoicing can be deferred until acceptance has been captured.</p>
<p><strong>Tax Updates</strong> &#8211; Additional tax fields have been added to the order entry screens that provide more flexibility with Vertex.</p>
<p><strong>Architectural Changes to Inventory </strong>- in 11i, Discrete and Process Inventory modules were entirely separate entities. Oracle has converged these modules into one data structure, where functionalities from both modules have combined to be available to both. This doesn&#8217;t mean much from an OM perspective, but technical changes have been performed to the Pick Release and Ship Confirmation processes to work with the new combined inventory model.</p>
<p><strong>Architectural Changes to OM, Install Base, and Service Contracts Integration</strong> &#8211; My understanding is that there is no functionality changes, but from a technical standpoint Oracle has implemented a best practice approach  to OM to Install Base and OM to Service Contracts touchpoints to ensure API calls are used rather than direct queries.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/09/11/r12-order-management-%e2%80%93-what%e2%80%99s-changed/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pricing Qualifiers &#8211; How They Work and Creating Your Own</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 18:11:23 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/</guid>
		<description><![CDATA[Oracle Advanced Pricing allows you to create discounts, surcharges, and other promotions (called Modifiers) that can be applied against sales orders both manually and automatically. Often there are requirements for Modifiers to only apply in certain situations. For example, promotions on specific products or product lines, discounts on customer types, additional charges on international shipments, etc. So in addition to creating Modifiers, Qualifiers can be used to reference specific attributes of a sales order, product, customer, etc. to determine if the Modifier qualifies for the sales transaction. 

Oracle provides a wide array of Qualifiers to evaluate a sales transaction, but situations often arise where Qualifiers are needed for attributes that aren't available out of the box. However, with a few configurations and little bit of PL/SQL knowledge, you can create your own Qualifier attributes. ]]></description>
			<content:encoded><![CDATA[<p>Oracle Advanced Pricing allows you to create discounts, surcharges, and other promotions (called Modifiers) that can be applied against sales orders both manually and automatically. Often there are requirements for Modifiers to only apply in certain situations. For example, promotions on specific products or product lines, discounts on customer types, additional charges on international shipments, etc. So in addition to creating Modifiers, Qualifiers can be used to reference specific attributes of a sales order, product, customer, etc. to determine if the Modifier qualifies for the sales transaction.</p>
<p>Oracle provides a wide array of Qualifiers to evaluate a sales transaction, but situations often arise where Qualifiers are needed for attributes that aren&#8217;t available out of the box. However, with a few configurations and little bit of PL/SQL knowledge, you can create your own Qualifier attributes.</p>
<p>But before we begin, it helps to look at some commonly used Qualifiers to see how they&#8217;re configured, and ultimately how Oracle is able to source the information. Let&#8217;s start by going to the Oracle Pricing Manager responsibility, navigate to Setup &gt; Attribute Management &gt; Contexts and Attributes. From this form, we&#8217;ll be able to see the starting point from where the Qualifier attributes are created.</p>
<p>Click the Search (flashlight) icon and select context type of Qualifier Context and code of Order. After you make the selection, you&#8217;ll see the seeded qualifying attributes listed under the Attributes block of the form.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual1.png" /></p>
<p>As an example, let&#8217;s look at the Order Type attribute, which represents the Order Type field of the sales order header. Here you&#8217;ll see the basic information that is associated with this Qualifier, most notably the Column Mapped, which indicates where in the Qualifier attribute structure to store the referenced value, and the Value Set, which is used to validate this value. The Value Set is important because when assigning this Qualifier to a Modifier, this is the Value Set that will be used to validate the input accepted when comparing this Qualifier to a value. In this case, when we reference the Order Type qualifier, the &#8220;QP_ORDER_TYPES_ALL&#8221; value set will only compare this qualifier to valid order types; not line types, random text, numeric inputs, etc.</p>
<p>To see how this attribute is mapped to the actual Order Type field on the sales order, we need to return back to the menu and navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping. Enter Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type. You&#8217;ll notice that the same listing of contexts is displayed under the Contexts block.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual2.png" /></p>
<p>Select the ORDER code record and click the Link Attributes button. A form will display a listing of all the same attributes we saw from the Contexts and Attributes form, but with information as to where the Attributes are sourced from.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual3.png" /></p>
<p>Looking at the Order Type attribute, you&#8217;ll see that Level for this attribute is BOTH. This indicates that the Order Type can be referenced from the header or the line details of the corresponding transaction. Other options for Level include LINE, which indicates that the source is at the line detail level, and ORDER, which indicates the attribute can be sourced at header level of the transaction.</p>
<p>Next to the Level is the Attribute Mapping Method, which indicates the method in which the Attribute is sourced. In this case, the method for Order Type is ATTRIBUTE MAPPING, which indicates a more technical reference is required to source this value (i.e. PL/SQL, system variable, etc.). Other Attribute Mapping Methods include RUNTIME SOURCE, indicating that the attribute will be populated by the QP_CUSTOM package, and USER ENTERED, indicating that the value will be populated by the user (this is more common for Pricing Attributes rather than Qualifier Attributes).</p>
<p>To see the kind of Attribute Mapping reference that exists for Order Type, click on the Attribute Mapping button. What you&#8217;ll see is a listing of mapping setups for the Order Type attribute broken down by application. Oracle accepts an attribute mapping by application because from a data structure standpoint, the reference to Order Type can be different in Order Management then other modules like Telesales, Service Contracts, etc.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual4.png" /></p>
<p>To view the source mapping for Order Management, click on the record indicating ONT for request type and take note of the settings for Header Level and Line Level Attribute Mappings on the bottom half of the form. Here&#8217; you&#8217;ll see the actual PL/SQL references that are being made to retrieve the Order Type. Note the Seeded/User Source Type and Seeded/User Value String settings for each:</p>
<p>Reference Type:        PL/SQL API<br />
User Value:                OE_ORDER_PUB.G_HDR.order_type_id</p>
<p>This shows us that this attribute is sourced via a PL/SQL API and calls the PL/SQL string OE_ORDER_PUB.G_HDR.order_type_id. The G_HDR record structure is seeded by Oracle and contains data for the sales order header transaction that is being actively processed and evaluated. It is accessible globally from where the Pricing Engine is executing the PL/SQL code contained in the User Value field. So by accessing this global record structure, Oracle was able to map the Order Type transaction ID to the Order Type attribute &#8211; making this information available to Qualifier and Modifier setups in Advanced Pricing.</p>
<p>Other more advanced Qualifier examples exist which show direct calls to seeded PL/SQL functions. Starting again from the Setup &gt; Attribute Management &gt; Attribute Linking and Mapping navigation path, check out the Party ID located under the CUSTOMER context and take a look at the User Value String under the same Link Attributes form we were just in.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual5.png" /></p>
<p>Since the customer party ID cannot be directly sourced from sales order transaction, Oracle had to develop a quick function call that references the SOLD_TO_ORG_ID of the sales order to retrieve the Party ID from the HZ table structure (QP_SOURCING_API_PUB. GET_PARTY_ID). Notice that since customer information is stored on both the header and the lines of a sales order transaction that Oracle utilizes the G_HDR and G_LINE global record structures to pass the sold to customer information to the seeded API.</p>
<p>QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_HDR.sold_to_org_id)</p>
<p>QP_SOURCING_API_PUB.GET_PARTY_ID(OE_ORDER_PUB.G_LINE.sold_to_org_id)</p>
<p>Opening up a TOAD session and running the describe command on the QP_SOURCING_API_PUB package shows the details of this function in addition to other functions developed by Oracle to retrieve other data mapping sources used by other seeded Qualifiers.</p>
<p>Given what we&#8217;ve seen so far, the configuration aspect of a Qualifier is quite simple, but it takes just a bit of PL/SQL knowledge to actually map your Qualifier to a source. You don&#8217;t quite need to be an expert per say, but have just enough technical know-how to be &#8220;dangerous&#8221;.</p>
<p>Now that we have a decent idea of the inner workings of a Qualifer, let&#8217;s walk through the steps again and try to create our own. Say for example that a business requirement has come up which calls for a discount to be applied based on a value stored in a Descriptive Flexfield segment (we&#8217;ll pretend it&#8217;s ATTRIBUTE10 of the sales order header).</p>
<p>We first begin by navigating to Setup &gt; Attribute Management &gt; Contexts and Attributes to choose our Context and create our core Attribute information. Since this Attribute will be mapped to a value stored on the sales order header, it&#8217;s most appropriate to place our attribute under the Order context.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual6.png" /></p>
<p>Next, let&#8217;s add a record under the Attributes block and provide our Attribute with a Code, Name, and Description.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual7.png" /></p>
<p>After identifying our Attribute, we&#8217;ll need to choose our Value Set. Let&#8217;s assume that this is a Yes/No field that will be validated against the &#8220;QP: Yes/No&#8221; value set. We&#8217;ll also need to assign an available column. I&#8217;d recommend selecting a column that is a distance away from the last column that is being used to avoid any conflicts (in case Oracle decides to introduce new qualifying attributes in the future).</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual8.png" /></p>
<p>Now let&#8217;s navigate to Setup &gt; Attribute Management &gt; Attribute Linking and Mapping to map our newly created Attribute to a source. Let&#8217;s again select Order Fulfillment for Pricing Transaction Entity and Qualifier Context for Context Type, choose ORDER as the Context, and click the Link Attributes button.</p>
<p>Once the Link Attributes form is open, we&#8217;ll add a new record to map our Attribute. By selecting the list of values for the Code, our new attribute should appear in the list. If our attribute is the only attribute under the Order context that is not mapped, it should default to our Attribute automatically.</p>
<p>Assuming that we&#8217;ll want this Qualifier accessible from the header and line details of a sales order transaction, we&#8217;ll select BOTH as our Level, followed by Attribute Mapping as our Attribute Mapping Method.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual9.png" /></p>
<p>Save your changes, and click on the Attribute Mapping button. Since our Qualifier is referencing the Flexfield segment within the Order Management module, let&#8217;s again select the ONT reference record, but this time populate &#8220;Advanced Pricing&#8221; for the Application Name.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual10.png" /></p>
<p>Moving along to the Header and Line Level setups, we want to indicate that our User Source Type will be a PL/SQL API for both, followed by the appropriate PL/SQL string in the User Value String field.</p>
<p>You might be asking, &#8220;How do we determine what PL/SQL string to use?&#8221;</p>
<p>If we refer back to the Order Type attribute example, the G_HDR record structure is the global structure that is populated with the current sales order header transaction data. If you&#8217;re familiar with the OE_ORDER_HEADERS_ALL table, you&#8217;ll know that all we need to do is reference G_HDR.ATTRIBUTE10 to retrieve our Flexfield segment. Since we&#8217;re referring to the Flexfield segment stored on the order header, the User Value String values for both the Header and Line Levels will be the same.</p>
<p>OE_ORDER_PUB.G_HDR.attribute10</p>
<p>This example was fairly straight forward since the Flexfield segments are easily identifiable and stored directly in the G_HDR record structure. However, if in other situations you&#8217;re unsure of which column actually stores the data you wish to reference, you may have to query data against the OE_ORDER_HEADERS_ALL or OE_ORDER_LINES_ALL tables to determine where your data is stored. And in cases where the value isn&#8217;t found in these tables, then you may have to develop a custom API similar to how the Party ID Qualifier is implemented (I&#8217;ll post an example of how to do this in a future article).</p>
<p>Now that we&#8217;re finished with our setups, we can save our changes.</p>
<p>After saving your work, let&#8217;s navigate to the Tools file menu and select Build Attribute Mapping rules. This will compile our Attribute Mapping setups with our PL/SQL reference in place. If any typos or incorrect syntax is made in the User Value, you&#8217;ll find out from the results of the compilation.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual11.png" /></p>
<p>Assuming that you&#8217;ve enter the PL/SQL string correctly, you should receive a message indicating the Attribute Mapping Rules have been built successfully.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual12.png" /></p>
<p>Upon clicking OK closing the Attribute Mapping form you may receive the following warning message:</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual13.png" /></p>
<p>Oracle is screaming at us because we chose to only map our attribute for the Order Management application and not the other applications that are listed under the Application Types. For the purposes of this demonstration, we can click OK and be done with hit. However, if you&#8217;re organization is utilizing Advanced Pricing from elsewhere (Service Contracts, Telesales, etc.), then I would recommend that you also provide source mappings for those dependent applications as well.</p>
<p>Sweet! Now you have a Qualifier that references a sales order header Flexfield attribute! You should now be able to view this Qualifier when setting up List or Line Qualifiers from the Modifier setup form as shown below.</p>
<p><img src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2008/07/072108_1813_PricingQual14.png" /></p>
<p>Now even though we&#8217;ve built and compiled our attribute mapping, Oracle may still warn you that the Qualifier you&#8217;ve reference hasn&#8217;t been mapped. If this is the case, you can run the Build Attribute Mapping Rules concurrent request and this should take care of the issue.</p>
<p>As I mentioned, this Qualifier serves as a good example for when the data is readily accessible via the G_HDR or G_LINE global record structures, but stay tuned for another example which will show how we can create our own custom PL/SQL function to source an Attribute.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/07/21/pricing-qualifiers-%e2%80%93-how-they-work-and-creating-your-own/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Implementing Export Compliance in Oracle</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/#comments</comments>
		<pubDate>Sat, 31 May 2008 02:38:11 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/</guid>
		<description><![CDATA[In the United States there are numerous international embargo laws in place that restrict U.S. based corporations from selling to countries that are deemed a threat by the government. Cuba, Iran, and North Korea are all examples of countries which no one in the U.S. can conduct business with. These laws can change often depending on the political atmosphere or whoever happens to be in office, making it difficult for organizations who sell or distribute products globally to not only adhere to the laws, but to also adapt their audit procedures when a change to policy occurs.]]></description>
			<content:encoded><![CDATA[<p>In the United States there are numerous international embargo laws in place that restrict U.S. based corporations from selling to countries that are deemed a threat by the government. Cuba, Iran, and North Korea are all examples of countries which no one in the U.S. can conduct business with. These laws can change often depending on the political atmosphere or whoever happens to be in office, making it difficult for organizations who sell or distribute products globally to not only adhere to the laws, but to also adapt their audit procedures when a change to policy occurs.</p>
<p>For corporations which conduct sales in the U.S. and in other locations across the world, the complexity increases because every country has their own set of embargo laws. For example, a U.S. based company cannot sell to an Iranian company because of U.S. regulation, but on the other hand, if the same organization has a location or distribution warehouse in France, their French location could sell to that same Iranian customer. Granted, this situation is also dependent on the citizenship of the individual conducting the sale &#8211; an employee sitting at a desk in France can&#8217;t make the same sale to Iran if they hold U.S. citizenship.</p>
<p>By now I think you get the point &#8211; keeping track and enforcing export compliance procedures can be quite complex. If your business operates an international sales organization and has difficulty enforcing and adapting to the ever changing embargo regulations at a global level, then the Oracle Export Compliance module, in conjunction with Kewill export compliance screening, can provide just the tools you need to ensure your sales organization remains compliant.</p>
<p><strong>A Brief Look at the Technology<br />
</strong></p>
<p>Out of the box, Oracle provides a workflow process in Order Management that establishes an XML based connection to a selected 3<sup>rd</sup> party compliance screening service. Kewill, a commonly used screening service in the Oracle community, maintains an elaborate database of the latest export compliance regulations. Upon entering and booking a sales order, Oracle sends various information about the sale order transaction to Kewill, who then accepts and evaluates the sale based on the most current and up-to-date export compliance laws.</p>
<p>Once Kewill determines whether or not the sale is compliant, the results are sent back to Oracle Order Management. If the result is found to violate export compliance laws, the sales order goes on export compliance violation hold and awaits review by an individual in the organization who is given the property authority to either process the order or cancel the sale.</p>
<p>Additionally screening can be performed during the pick release and shipment confirmation processes to ensure that changes that are made to a sales order after booking are also captured and screened prior to sending the product out the door.</p>
<p>The technology around the communication between Oracle and Kewill services is fairly straightforward, but the actual screening performed by Kewill can be quite complex. As I mentioned earlier, international embargo laws vary country, so to deem a transaction compliant there are many pieces of information to consider. What country is the customer located? Do the billing and shipping locations for the customer differ? Or is the billing customer entirely different than the shipping customer?</p>
<p>What about your facilities &#8211; is the location of your shipping warehouse different than the location from where the order is being processed? Does the citizenship of the individual entering the transaction qualify to make the sale?</p>
<p>As you can see, the situation can get quite complex. How these questions are answered determines the set of export compliance laws that need to be evaluated. Lucky for you, Oracle Export Compliance and Kewill takes care of this complexity for you.</p>
<p>For more information regarding the Oracle Export Compliance product visit <a href="http://www.oracle.com/products/export/index.html">http://www.oracle.com/products/export/index.html</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/05/30/implementing-export-compliance-in-oracle/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tax on Freight &amp; Special Charges in Order Management</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 15:27:56 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Advanced Pricing]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Receivables]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/</guid>
		<description><![CDATA[One of the fundamental flaws in Oracle Order Management (OM) is the inability to include tax on freight and special charge modifiers that are setup in Advanced Pricing (QP).  There's just no way to do it out of the box.  Even if you use the Oracle suggested work around, which is to add freight as a line item to a sales order, it's still a manual process and defeats the purpose of being able to include and calculate freight automatically the way you can through a charge modifier.  ]]></description>
			<content:encoded><![CDATA[<p>One of the fundamental flaws in Oracle Order Management (OM) is the inability to include tax on freight and special charge modifiers that are setup in Advanced Pricing (QP).   There&#8217;s just no way to do it out of the box.   Even if you use the Oracle suggested work around, which is to add freight as a line item to a sales order, it&#8217;s still a manual process and defeats the purpose of being able to include and calculate freight automatically the way you can through a charge modifier.  </p>
<p>Oracle does provide the ability to recognize freight as revenue, which in turn calculates tax on the charge, but this doesn&#8217;t happen until the order has been interfaced to Receivables (AR). For some corporations, that calculation needs to happen at the time of order entry.   Additionally, some clients who utilize iPayment to authorize a credit card charge in OM and apply the fully transact the charge when the order is interfaced to AR will also encounter issues because the authorized amount, which doesn&#8217;t include the tax on freight, is less than the actual charge amount on the AR side, causing the credit card transaction to fail entirely.  </p>
<p>Needless to say, it&#8217;s a pain, and a blatant functionality gap.   However, with a slight customization, a semi-acceptable solution can be found by harnessing some of the functionalities available in Advanced Pricing.</p>
<p>Going back to Oracle&#8217;s recommended solution of adding an order line item for freight if it is to be taxed &#8211; the main issue with this work around is that it&#8217;s not automatically added to the order.   For high-volume order entry environments, this is an absolute necessity.   One of the great advantages of modifiers in Advanced Pricing is the ability to allow charges and adjustments to be automatically applied to an order based on qualifying events.   This is an important piece of functionality that is lost using Oracle&#8217;s line item workaround.</p>
<p>However, there is a functionality in Advanced Pricing, often not used, that can automate the entry of an order line.   The &#8220;get item&#8221; functionality under the &#8220;Promotion&#8221; modifier type allows you to add items to a sales order based on the qualifiers you set.   This functionality is typically used for a &#8220;buy one, get one free&#8221; scenario, but can be used in this situation to add a freight order line automatically to a sales order.</p>
<p>The only setback to this functionality is that the pricing capabilities are limited.   When setting up a &#8220;get item&#8221; modifier, you cannot attach a formula.     The functionality only allows you to obtain a fixed list price from a price list or generate a new price.   This may be OK if you&#8217;re organization charges a fixed amount for freight, but for those who calculate freight based on the selling amount, this is very bad.   Out of the box, there is no way to get around this.   Even applying a modifier on top of the order line that is added by the &#8220;get item&#8221; modifier doesn&#8217;t work, because when the line item is added, the Calculate Price Flag is set to &#8220;Partial Pricing&#8221;.   What &#8220;Partial Pricing&#8221; means is that it will obtain the price that is established in the &#8220;get item&#8221; setup, but it will neglect any modifiers or adjustments applied to that order line.   The only way around this is to manually set the Calculate Price Flag to &#8220;Calculate Price&#8221;, then re-price the line.  </p>
<p>While setting the Calculate Price Flag manually works, this defeats the purpose of adding the freight line automatically to the order.   The point of this exercise is to add the line with the price automatically calculated so that there&#8217;s no need for the users to perform this step in a high volume order entry environment.   This is where that &#8220;slight&#8221; customization as I mentioned earlier comes in.</p>
<p>If setting the Calculate Price Flag to &#8220;Calculate Price&#8221; after the line has been automatically added solves the issue, then why not have a concurrent request, which runs as often as the business desires, perform this action so that the price of the freight order line is correctly calculated?   This is exactly what we did with my last client and it ended up working quite well, but with one little exception.</p>
<p>Being that this is a line item, there is no way to prorate the freight in the event there is partial or multiple shipments for a given order.   Depending on the nature of your business, this may not be acceptable.   There&#8217;s a couple of way to address this:</p>
<ul>
<li>Restrict partial shipments from occurring by enabling header level invoicing or utilizing fulfillment sets.   This will ensure that all line items are fulfilled before issuing an invoice.   However, if you&#8217;re organization requires that an invoice be generated for each shipment, this would not be an acceptable solution.</li>
<li>If the first option doesn&#8217;t fit your business model, you can place an automatic invoicing hold on the freight line item that is only released when the entire order is shipped.   What this does is allow items that are shipped partial to generate an invoice, but delays the billing of freight until the last shipment is made.   The automatic hold can be done as a hold source, but releasing the hold would need to be another one of those &#8220;slight&#8221; customizations you would need.   However, if you&#8217;re organization needs to include freight charges with every delivery, this solution wouldn&#8217;t work for you either.</li>
<li>If neither of the above option is acceptable, and you need the whole shebang, than a more complex customization is needed that splits the freight item for each shipment.   So for example, you have a 10 line item sales order where your freight charge is $50.   During the first shipment, 5 of the 10 lines are shipped out there door.     What the customization would do is split the freight line item into two lines 0.5 quantities, which in affect would split the price in half.   Only one of the split lines would be processed with the shipment, the other split line would be placed on hold.   For this to happen, you&#8217;re item would need to be setup as &#8220;OM Divisible&#8221; enabled, which indicates that fractional quantities are allowed.</li>
</ul>
<p>Getting around this issue is not easy, but can be possible.   If you&#8217;d like to obtain a copy of my code which resolves the pricing issues with adding line items automatically using the &#8220;get item&#8221; functionality, feel free to contact me.</p>
<p>Also, to find out how to calculate freight, charges, or adjustments based on the total order amount, check out this article.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/02/29/tax-on-freight-special-charges-in-order-management/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Interfacing Oracle to Your Legacy WMS &#8211; A Good Idea?</title>
		<link>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 18:11:34 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Inventory]]></category>
		<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Shipping Execution]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/</guid>
		<description><![CDATA[Over the years I've been involved with several Oracle implementations where the decision was made to retain the existing warehouse and inventory management systems in place of Oracle WMS. Perhaps your organization had made a similar decision knowing that the existing warehouse solution was best suited for your operations. Not to say that Oracle WMS is the best warehouse management solution out there - because it may very well not be. In fact, it may be true that your Legacy inventory system is the best fit for your business. Not only may it be the best fit, but keeping the existing system in place also eliminates any risk involved in changing the systems of what can be a fragile inventory and shipping operation. In other words, if it ain't broke, don't fix it - right?]]></description>
			<content:encoded><![CDATA[<p>Over the years I&#8217;ve been involved with several Oracle implementations where the decision was made to retain the existing warehouse and inventory management systems in place of Oracle WMS. Perhaps your organization had made a similar decision knowing that the existing warehouse solution was best suited for your operations. Not to say that Oracle WMS is the best warehouse management solution out there &#8211; because it may very well not be. In fact, it may be true that your Legacy inventory system is the best fit for your business. Not only may it be the best fit, but keeping the existing system in place also eliminates any risk involved in changing the systems of what can be a fragile inventory and shipping operation. In other words, if it ain&#8217;t broke, don&#8217;t fix it &#8211; right?</p>
<p>Perhaps, but before you go down this path there is another factor that should be taken into consideration: ensuring the order fulfillment process as a whole remains seamless and intact. What is the impact to the order entry, scheduling, pick release, on-hand availability and reservation processes if an interface is built to an outside WMS? The answer to this question is especially important in a high-volume environment where your organization fulfills hundreds to thousands of orders a day.</p>
<p>Generally, when an interface between Oracle (or any order processing system for that matter) and a Legacy WMS is built, a division of duties is established. Oracle is given the responsibility to capture orders and release these orders for shipment when ready. The Legacy WMS system is responsible for accepting shipment requests, processing these 
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
shipments, and sending the results of the shipment back to Oracle. Essentially, the Pick Release process in Oracle is the &#8220;throw&#8221; to Legacy WMS, and the Ship Confirmation step is the &#8220;catch&#8221;.</p>
<p>Since the nature of both system&#8217;s responsibilities require access to inventory data, your organization must understand that not only are you building a shipping interface, but you are committing to maintain two sets of inventory data that may require several interfaces. Oracle will need access to on-hand balance and reservation information so that order processors have insight to product availability and so that the system knows what orders are eligible for shipment. The Legacy WMS will of course require inventory data to maintain on-hand balance and deduct balances upon shipment. <em>Oracle inventory data, to a degree, will need to be in synch with inventory data in Legacy.<br />
</em></p>
<p>To what degree must be decided. Your organization may determine that both sets of inventory do not require real-time synchronization. For example, you may decide that manual adjustments made to inventory in Legacy may only need to be interfaced through a daily polling process that posts these updates to Oracle. If this direction is taken, then you will need to decide how your shipping interface will handle exceptions that may result from an on-hand balance delta between Oracle and Legacy inventory.</p>
<p>How can an inventory delta occur? Well, let&#8217;s say at the time we place an order for an item in Oracle there is 1 quantity available for reservation. However, during the day a warehouse worker reviews the item and determines that it fails to meet quality standards and as a result he/she performs a manual transaction in the Legacy WMS to issue that quantity to scrap. Because Oracle is unaware that this transaction occurred, the interface will continue to release the ordered item for shipment &#8211; even though there isn&#8217;t enough quantity on-hand in Legacy.</p>
<p>In this situation, you will need to ensure that this situation (among many others) can be handled by the interface. From a business prospective, a decision needs to be made to determine how exactly this delta should be handled. For example, you may want to leave the interfaced transaction in an error status and continue to retry until inventory is made available. Or you may want to cancel the transaction entirely. Whatever that action may be, it&#8217;s important that there is visibility to these kinds of inventory deltas.</p>
<p>If your organization decides that Oracle inventory and Legacy inventory requires real-time synchronization, your interface will <em>still</em> need the ability to handle situations that result in inventory deltas. Let&#8217;s face it &#8211; we&#8217;re all human. Any level of time and effort that is put into a real-time interface could still result in situations unaccounted for. And as best practice, an error handling procedure should still be implemented, especially in an environment where you require real-time synchronization.</p>
<p>Attempting to identify all scenarios that require a communication between Oracle and the Legacy WMS can get pretty crazy. Here are some examples of scenarios that would need to be included:</p>
<ul>
<li>Order cancelations in Oracle</li>
<li>Shipment cancelations in Legacy</li>
<li>Manual inventory transactions in either system</li>
<li>Inventory location transfers, but this is only important if your organization is utilizing hard reservations at order time, <em>which in this case you should seriously rethink using an interface.<br />
</em></li>
<li>Split and partial shipment scenarios</li>
</ul>
<p>We could go on and on with the list of scenarios to cover &#8211; these are just a small fraction of what can occur. And as I mentioned, even if you think you&#8217;ve listed all scenarios, you <em>still</em> need an error resolution process.</p>
<p>I can&#8217;t stress more the importance of error resolution in the event of an inventory delta. Whether it&#8217;s an automated or manual solution is not important, but the most important point is making sure that if an unidentified inventory delta situation occurs that the interface can be capture and handle this error. At minimum, if the error cannot be handled, at least provide the tools necessary to bring visibility to the situation. Trust me &#8211; there is nothing worse than going live with an interface and experiencing errors that were unaccounted for.</p>
<p>This all may come off as something you probably learned in a beginner&#8217;s course for software design, but I&#8217;ve seen and witnessed the aftereffects of an unsuccessful inventory interface launch with some very reputable clients. What results is the very situation that the client wanted to avoid in the first place &#8211; a chaotic situation that requires the involvement of lots of time and resources that the organization did not budget for but has no choice to deploy in order to fix an interface that is the backbone of their business.</p>
<p>Some brief examples I&#8217;d like to shareâ€¦</p>
<p style="margin-left: 36pt"><strong><em>Example #1<br />
</em></strong></p>
<p style="margin-left: 36pt"><em>Working with a life sciences client to implement Oracle Order Management a few years back, the organization decided to keep their existing mainframe inventory system with the idea of avoiding risk and cutting costs. The consulting group at the time recommended against this decision, but the client continued on and even decided to take on the effort using internal resources.<br />
</em></p>
<p style="margin-left: 36pt"><em>In a nutshell, the core exchange of the interface was centered on the Pick Release and Ship Confirmation processes. Testing was lackluster and didn&#8217;t cover all scenarios such as partial line shipments or order cancelations. More importantly, there lacked a substantial volume test.<br />
</em></p>
<p style="margin-left: 36pt"><em>What resulted at go-live was a disaster. Because of the bugs around partial line shipping, some orders were shipped two, three, and occasionally four times over. It took a team of 10-12 people during go-live to identify the dozen situations that were causing the Pick Release failures and shipping issues. Overall, it had taken a year+ to stabilize the situation and resulted in an exceeded IT budget and sales losses to the client. A team still exists today in maintaining and monitoring this interface.<br />
</em></p>
<p style="margin-left: 36pt"><strong><em>Example #2<br />
</em></strong></p>
<p style="margin-left: 36pt"><em>A publishing organization implementing Oracle decided to build an interface to their existing warehouse system. Aside from its age, this system was a beta version of the vendor&#8217;s product. It was heavily customized and interfaced to dozens of other order processing systems already. Cost and risk were definitely a factor.<br />
</em></p>
<p style="margin-left: 36pt"><em>Results at go-live were also poor. Multiple or no shipments were occurring. Since shipment sets in Oracle were not in synch with the activity that occurred in the legacy system, it caused many issues. An extensive amount of resources were needed to help stabilize the situation. Over time, the client became limited to the amount of functionality that could be used in Oracle. For example, for an order that had several shipping locations, separate orders had to be created for each shipment vs. establishing different shipping addresses at the order line level.<br />
</em></p>
<p style="margin-left: 36pt"><em>Additionally, the client implemented a daily process that &#8220;synchronizes&#8221; the Oracle on-hand balances with Legacy on-hand balances if a delta occurs (scary). Overall, it has taken nearly 2 years to stabilize the situation and currently has resources dedicated to the effort today.<br />
</em></p>
<p>As you can see, clients typically downplay the risk exposed to the rest of the fulfillment process when implementing an inventory interface to &#8220;protect&#8221; the shipping operation. Even worse, these organizations had made the decision to keep the legacy WMS because it was determined that the implementation effort in replacing the system was to costly compared to building the interface. Looking at this short-term, this may be true. But like most system interface projects, the cost of maintaining such a beast can greatly exceed the cost of implementing a new WMS over time (at least based on my experience).</p>
<p>If you&#8217;re an organization that is the process of deciding upon an inventory and shipment interface or a new WMS, I hope you can take the above situations into consideration. In going with the direction of an interface, you must also take into account:</p>
<ul>
<li><strong>Increased Go-Live Risk</strong> &#8211; In case the situation gets ugly, you&#8217;ll need extra time and resources to correct and stabilize the situation. Also will need to factor in any impact to the business and sales it may cause.</li>
<li><strong>A New Department </strong>- The interface itself will be a unique process that will require several individuals who understand and are familiar with the process and include expertise in both the Oracle and Legacy inventory systems.</li>
<li><strong>Difficulty or Inability to Upgrade/Change </strong>- Being that the interface will be a delicate process requiring much involvement from both systems at a technical level, any changes to the table structure on the Oracle side as a result of an upgrade or customization could result in breaking this interface. Likewise, any changes done to the legacy side could also adversely affect this interface. With that said, expect all upgrade efforts to your system to exponentially increase.</li>
</ul>
<p>My position should be pretty clear from all my ranting &#8211; DON&#8217;T DO IT! Or at least if you do, thoroughly evaluate the alternative of implementing a new WMS. Hopefully through the experiences I&#8217;ve shared, you&#8217;ll find that both options are exposed to the same level risk, but that the long term cost benefits of implementing a new WMS will prevail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2008/01/10/interfacing-oracle-to-your-legacy-wms-a-good-idea/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finally! An OE_Order_PUB.Process_Order Script That Works!</title>
		<link>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 22:22:03 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Technical]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/</guid>
		<description><![CDATA[Recently I was looking for any working example of the OE_Order_PUB.Process_Order API to use for a volume test I wanted to setup.  The idea would be to identify a base script that with minimal changes could be used to create and book a mass amount of sales orders.  I scoured Metalink and Google, and for the longest time I could not identify a single working example.  Many authors claimed to have posted an OE_Order_PUB.Process_Order script that, with slight modifications, are working examples, but this never was the case.  There was always syntax or incorrect API parameter issues with each script I encountered...]]></description>
			<content:encoded><![CDATA[<p>Recently I was looking for any working example of the OE_Order_PUB.Process_Order API to use for a volume test I wanted to setup.   The idea would be to identify a base script that with minimal changes could be used to create and book a mass amount of sales orders.   I scoured Metalink and Google, and for the longest time I could not identify a single working example.   Many authors claimed to have posted an OE_Order_PUB.Process_Order script that, with slight modifications, are working examples, but this never was the case.   There was always syntax or incorrect API parameter issues with each script I encountered.</p>
<p>
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
However, after a few more hours of searching, I was able to find a good, fairly working example on Metalink note 292743.1.   While this example was presented to show how to create an RMA order header using OE_Order_PUB.Process_Order, the script can be easily modified to create orders of all types simply by choosing an order type ID that is of type ORDER or RETURN depending on your requirement.  </p>
<p>Additionally, to create a sales order header, at minimum you&#8217;ll need to specify a customer, price list, currency and any required descriptive flexfield values dictated by your setups.   You may also need a customer purchase order number if you&#8217;re order type has been setup to require it before booking.   The code excerpt below shows this information along with other required data that is needed to produce an order header:</p>
<blockquote><p>l_header_rec.operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_header_rec.order_type_id := 100000;<br />
l_header_rec.sold_to_org_id := 1000;<br />
l_header_rec.price_list_id := 100;<br />
l_header_rec.pricing_date := SYSDATE;<br />
l_header_rec.transactional_curr_code := &#8216;USD&#8217;;<br />
l_header_rec.flow_status_code:=&#8217;ENTERED&#8217;;<br />
l_header_rec.cust_po_number := &#8216;123&#8242;;<br />
l_header_rec.attribute1   := &#8216;ABC&#8217;;</p></blockquote>
<p>The script also doesn&#8217;t create any order lines, so this code would also have to be added.   All that the OE_Order_PUB.Process_Order API needs to create an order line is an ordered item, quantity, and any required descriptive flexfield values that may be needed.</p>
<blockquote><p>l_line_tbl(1).inventory_item_id := 201775;<br />
l_line_tbl(1).ordered_quantity := 1;<br />
l_line_tbl(1).attribute1 := &#8216;ABC&#8217;;</p></blockquote>
<p>At the beginning of the script you will also need to add an API call to dbms_application_info.set_client_info to set the organization context as well as initializing the user, responsibility, and application under which the order(s) will be created.</p>
<blockquote><p>dbms_application_info.set_client_info(100000);<br />
â€¦<br />
fnd_global.apps_initialize(l_user, l_resp, l_appl);</p></blockquote>
<p>Since I want this script to create not just one order, but many orders, I needed to insert a loop into the script with parameters that let me control how many orders to create, and whether to enable or disable debug.   For good performance and to avoid exceeding any buffer limitations, a debug &#8220;switch&#8221; is a good things to have, especially when creating hundreds or even thousands of sales orders.    </p>
<blockquote><p>l_debug_level number := 0;   &#8212; OM DEBUG LEVEL (MAX 5)<br />
l_no_orders number := 100;       &#8212; NO OF ORDERS<br />
â€¦<br />
for i in 1..l_no_orders loop &#8212; BEGIN LOOP<br />
â€¦<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE (&#8217;debug message here&#8217;);<br />
end if;<br />
â€¦<br />
end loop; &#8212; END LOOP</p></blockquote>
<p>With these modifications in place, I now have a working script that will create a mass amount of sales orders for the volume test I need.   I hope this comes in handy for you!</p>
<hr />
<div id="code">DECLARE                              </p>
<p>l_api_version_number NUMBER := 1;<br />
l_return_status VARCHAR2(2000);<br />
l_msg_count NUMBER;<br />
l_msg_data VARCHAR2(2000);</p>
<p>/*****************PARAMETERS****************************************************/<br />
l_debug_level number := 0;   &#8212; OM DEBUG LEVEL (MAX 5)<br />
l_org number := 1000;                 &#8212; OPERATING UNIT<br />
l_no_orders number := 100;       &#8212; NO OF ORDERS<br />
l_user number := 10;           &#8212; USER<br />
l_resp number := 100;         &#8212; RESPONSIBLILTY<br />
l_appl number := 660;             &#8212; ORDER MANAGEMENT</p>
<p>/*****************INPUT VARIABLES FOR PROCESS_ORDER API*************************/<br />
l_header_rec oe_order_pub.header_rec_type;<br />
l_line_tbl oe_order_pub.line_tbl_type;<br />
l_action_request_tbl oe_order_pub.Request_Tbl_Type;</p>
<p>/*****************OUT VARIABLES FOR PROCESS_ORDER API***************************/<br />
l_header_rec_out oe_order_pub.header_rec_type;<br />
l_header_val_rec_out oe_order_pub.header_val_rec_type;<br />
l_header_adj_tbl_out oe_order_pub.header_adj_tbl_type;<br />
l_header_adj_val_tbl_out oe_order_pub.header_adj_val_tbl_type;<br />
l_header_price_att_tbl_out oe_order_pub.header_price_att_tbl_type;<br />
l_header_adj_att_tbl_out oe_order_pub.header_adj_att_tbl_type;<br />
l_header_adj_assoc_tbl_out oe_order_pub.header_adj_assoc_tbl_type;<br />
l_header_scredit_tbl_out oe_order_pub.header_scredit_tbl_type;<br />
l_header_scredit_val_tbl_out oe_order_pub.header_scredit_val_tbl_type;<br />
l_line_tbl_out oe_order_pub.line_tbl_type;<br />
l_line_val_tbl_out oe_order_pub.line_val_tbl_type;<br />
l_line_adj_tbl_out oe_order_pub.line_adj_tbl_type;<br />
l_line_adj_val_tbl_out oe_order_pub.line_adj_val_tbl_type;<br />
l_line_price_att_tbl_out oe_order_pub.line_price_att_tbl_type;<br />
l_line_adj_att_tbl_out oe_order_pub.line_adj_att_tbl_type;<br />
l_line_adj_assoc_tbl_out oe_order_pub.line_adj_assoc_tbl_type;<br />
l_line_scredit_tbl_out oe_order_pub.line_scredit_tbl_type;<br />
l_line_scredit_val_tbl_out oe_order_pub.line_scredit_val_tbl_type;<br />
l_lot_serial_tbl_out oe_order_pub.lot_serial_tbl_type;<br />
l_lot_serial_val_tbl_out oe_order_pub.lot_serial_val_tbl_type;<br />
l_action_request_tbl_out oe_order_pub.request_tbl_type;</p>
<p>l_msg_index NUMBER;<br />
l_data VARCHAR2(2000);<br />
l_loop_count NUMBER;<br />
l_debug_file VARCHAR2(200);</p>
<p>&#8211; book API vars<br />
b_return_status VARCHAR2(200);<br />
b_msg_count NUMBER;<br />
b_msg_data VARCHAR2(2000);</p>
<p>BEGIN</p>
<p>dbms_application_info.set_client_info(l_org);</p>
<p>/*****************INITIALIZE DEBUG INFO*************************************/</p>
<p>if (l_debug_level > 0) then<br />
       l_debug_file := OE_DEBUG_PUB.Set_Debug_Mode(&#8217;FILE&#8217;);<br />
       oe_debug_pub.initialize;<br />
       oe_debug_pub.setdebuglevel(l_debug_level);<br />
       Oe_Msg_Pub.initialize;<br />
end if;</p>
<p>/*****************INITIALIZE ENVIRONMENT*************************************/<br />
fnd_global.apps_initialize(l_user, l_resp, l_appl); &#8212; pass in user_id, responsibility_id, and application_id<br />
/*****************INITIALIZE HEADER RECORD******************************/<br />
l_header_rec := OE_ORDER_PUB.G_MISS_HEADER_REC;<br />
/*****************POPULATE REQUIRED ATTRIBUTES **********************************/</p>
<p>l_header_rec.operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_header_rec.order_type_id := 100000;<br />
l_header_rec.sold_to_org_id := 1000;<br />
l_header_rec.price_list_id := 100;<br />
l_header_rec.pricing_date := SYSDATE;<br />
l_header_rec.transactional_curr_code := &#8216;USD&#8217;;<br />
l_header_rec.flow_status_code:=&#8217;ENTERED&#8217;;<br />
l_header_rec.cust_po_number := &#8216;123&#8242;;<br />
l_header_rec.attribute1   := &#8216;ABC&#8217;;</p>
<p>  </p>
<p>/*****************INITIALIZE ACTION REQUEST RECORD*************************************/</p>
<p>l_action_request_tbl(1) := OE_ORDER_PUB.G_MISS_REQUEST_REC;<br />
/*****************INITIALIZE LINE RECORD********************************/</p>
<p>l_line_tbl(1) := OE_ORDER_PUB.G_MISS_LINE_REC;<br />
l_line_tbl(1).operation := OE_GLOBALS.G_OPR_CREATE;<br />
l_line_tbl(1).inventory_item_id := 201775;<br />
l_line_tbl(1).ordered_quantity := 1;<br />
for i in 1..l_no_orders loop &#8212; BEGIN LOOP</p>
<p>/*****************CALLTO PROCESS ORDER API*********************************/</p>
<p>OE_Order_PUB.Process_Order( p_api_version_number => l_api_version_number,<br />
p_header_rec => l_header_rec,<br />
p_line_tbl => l_line_tbl,<br />
p_action_request_tbl => l_action_request_tbl,<br />
&#8211; OUT variables<br />
x_header_rec => l_header_rec_out,<br />
x_header_val_rec => l_header_val_rec_out,<br />
x_header_adj_tbl => l_header_adj_tbl_out,<br />
x_header_adj_val_tbl => l_header_adj_val_tbl_out,<br />
x_header_price_att_tbl => l_header_price_att_tbl_out,<br />
x_header_adj_att_tbl => l_header_adj_att_tbl_out,<br />
x_header_adj_assoc_tbl => l_header_adj_assoc_tbl_out,<br />
x_header_scredit_tbl => l_header_scredit_tbl_out,<br />
x_header_scredit_val_tbl => l_header_scredit_val_tbl_out,<br />
x_line_tbl => l_line_tbl_out,<br />
x_line_val_tbl => l_line_val_tbl_out,<br />
x_line_adj_tbl => l_line_adj_tbl_out,<br />
x_line_adj_val_tbl => l_line_adj_val_tbl_out,<br />
x_line_price_att_tbl => l_line_price_att_tbl_out,<br />
x_line_adj_att_tbl => l_line_adj_att_tbl_out,<br />
x_line_adj_assoc_tbl => l_line_adj_assoc_tbl_out,<br />
x_line_scredit_tbl => l_line_scredit_tbl_out,<br />
x_line_scredit_val_tbl => l_line_scredit_val_tbl_out,<br />
x_lot_serial_tbl => l_lot_serial_tbl_out,<br />
x_lot_serial_val_tbl => l_lot_serial_val_tbl_out,<br />
x_action_request_tbl => l_action_request_tbl_out,<br />
x_return_status => l_return_status,<br />
x_msg_count => l_msg_count,<br />
x_msg_data => l_msg_data);</p>
<p>/*****************CHECK RETURN STATUS***********************************/</p>
<p>if l_return_status = FND_API.G_RET_STS_SUCCESS then<br />
       if (l_debug_level > 0) then<br />
               dbms_output.put_line(&#8217;success&#8217;);<br />
       end if;<br />
       commit;<br />
       OE_ORDER_BOOK_UTIL.COMPLETE_BOOK_ELIGIBLE(1.0,<br />
       FND_API.G_FALSE,<br />
       l_header_rec_out.header_id,<br />
       b_return_status,<br />
       b_msg_count,<br />
       b_msg_data<br />
       );<br />
       commit;<br />
else<br />
       if (l_debug_level > 0) then<br />
               dbms_output.put_line(&#8217;failure&#8217;);<br />
       end if;<br />
       rollback;<br />
end if;</p>
<p>end loop; &#8212; END LOOP</p>
<p>/*****************DISPLAY RETURN STATUS FLAGS******************************/<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER ret status IS: &#8216; || l_return_status);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER msg data IS: &#8216; || l_msg_data);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;process ORDER msg COUNT IS: &#8216; || l_msg_count);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.order_number IS: &#8216; || to_char(l_header_rec_out.order_number));<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.return_status IS: &#8216; || l_header_rec_out.return_status);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.booked_flag IS: &#8216; || l_header_rec_out.booked_flag);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.header_id IS: &#8216; || l_header_rec_out.header_id);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.order_source_id IS: &#8216; || l_header_rec_out.order_source_id);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;header.flow_status_code IS: &#8216; || l_header_rec_out.flow_status_code);<br />
end if;</p>
<p>/*****************DISPLAY ERROR MSGS*************************************/<br />
if (l_debug_level > 0) then<br />
       FOR i IN 1 .. l_msg_count LOOP<br />
       Oe_Msg_Pub.get(<br />
       p_msg_index => i<br />
       ,p_encoded => Fnd_Api.G_FALSE<br />
       ,p_data => l_data<br />
       ,p_msg_index_out => l_msg_index);</p>
<p>       DBMS_OUTPUT.PUT_LINE(&#8217;message is: &#8216; || l_data);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;message index is: &#8216; || l_msg_index);<br />
       END LOOP;<br />
end if;<br />
if (l_debug_level > 0) then<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug = &#8216; || OE_DEBUG_PUB.G_DEBUG);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug Level = &#8216; || to_char(OE_DEBUG_PUB.G_DEBUG_LEVEL));<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;Debug File = &#8216; || OE_DEBUG_PUB.G_DIR||&#8217;/'||OE_DEBUG_PUB.G_FILE);<br />
       DBMS_OUTPUT.PUT_LINE(&#8217;****************************************************&#8217;);</p>
<p>       OE_DEBUG_PUB.DEBUG_OFF;<br />
end if;</p>
<p>END;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2007/12/06/finally-an-oe_order_pubprocess_order-script-that-works/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Collecting Credit Card Information in OM Without iPayment</title>
		<link>http://www.bryanthompsononline.com/oracle/2007/08/24/collecting-credit-card-information-in-om-without-ipayment/</link>
		<comments>http://www.bryanthompsononline.com/oracle/2007/08/24/collecting-credit-card-information-in-om-without-ipayment/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 20:02:57 +0000</pubDate>
		<dc:creator>bryan</dc:creator>
				<category><![CDATA[Order Management]]></category>
		<category><![CDATA[Order to Cash]]></category>
		<category><![CDATA[Receivables]]></category>

		<guid isPermaLink="false">http://www.bryanthompsononline.com/oracle/2007/08/24/collecting-credit-card-information-in-om-without-ipayment/</guid>
		<description><![CDATA[Up to 11.5.9, it was impossible to utilize the credit card functionality and secure fields unless you also implemented iPayment. Oracle iPayment is the module which screens and processes credit card transactions through Order Management (OM). While this is a nice package for clients who process high volumes of credit card payments, it's not cost effective for the rest who may process credit cards on occasion and prefer to use an offline processor. So at the time you had two options; either fork up the money to buy the iPayment module, or process and store the transactional information offline and enter the prepayment manually in the system. 

However, as of recently, Oracle has offered a patch (5192725) which allows for the use of the credit card fields in OM without the need to install iPayment. The application of this patch alone is not enough, as there are other tweaks that need to take place to make it all work. At any rate, I take this as a great act of generosity on Oracle's part - it's not often they provide us the choice to implement a module!...]]></description>
			<content:encoded><![CDATA[<p>Up to 11.5.9, it was impossible to utilize the credit card functionality and secure fields unless you also implemented iPayment. Oracle iPayment is the module which screens and processes credit card transactions through Order Management (OM). While this is a nice package for clients who process high volumes of credit card payments, it&#8217;s not cost effective for the rest who may process credit cards on occasion and prefer to use an offline processor. So at the time you had two options; either fork up the money to buy the iPayment module, or process and store the transactional information offline and enter the prepayment manually in the system.</p>
<p>However, as of recently, Oracle has offered a patch (5192725) which allows for the use of the credit card fields in OM without the need to install iPayment. The application of this patch alone is not enough, as there are other tweaks that need to take place to make it all work. At any rate, I take this as a great act of generosity on Oracle&#8217;s part &#8211; it&#8217;s not often they provide us the choice to implement a module!</p>
<p>The first step (of course) is to apply the patch. If you look up the patch in Metalink the given description is kind of hazy, but this was the patch recommended to me by Oracle. It appears to incorporate several fixes for Family Pack J. As with any patch, be sure to thoroughly test the patch first before applying to your production instance.</p>
<p>Next, we need to create our receipt class in AR which will classify the receipts that are generated from processing a credit card payment in OM. To do this navigate to the appropriate AR responsibility, than Setup &gt; Receipts &gt; Receipt Classes.</p>
<p><img height="416" src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082407_2002_CollectingC1.png" width="501" /></p>
<p>To start, let&#8217;s name our receipt class &#8220;Credit Card&#8221;, since this receipt class will be used specifically for receiving credit card prepayments. Additionally, we&#8217;ll want to specify &#8220;Automatic&#8221; to indicate this will be an automatic transaction that will be generated from OM.</p>
<p>As you continue entering the other key information, the most important field to note is the &#8220;Payment Type&#8221; field located under the &#8220;Automatic&#8221; tab. Prior to the introduction of this patch, we would select a type of &#8220;Credit Card&#8221; in order to enable the use of the credit card functionality with iPayment. But for our purposes, leave this field BLANK. With the application of patch 5192725, this is now the key indicator which will tell the credit card processor in OM to <em>avoid</em> making any calls to the iPayment module.</p>
<p>Once you have saved your &#8220;Credit Card&#8221; receipt class, you can continue with the remaining AR setups that are standard to any receipt class; most notably, the document sequence (which should be set to Automatic) and your receivables activity.</p>
<p>
<table align="left" border="0" cellpadding="0" cellspacing="0">
<tr><td>
<script type="text/javascript"><!--
google_ad_client = "pub-4516530845610319";
//200x200, created 12/11/07
google_ad_slot = "2730876339";
google_ad_width = 200;
google_ad_height = 200;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</td></tr>
</table>
After completing all the AR setups, our next step is to configure Order Management to use this receivables class when initiating a credit card prepayment. We do this by setting the &#8220;OM: Payment Method For Credit Card Transactions&#8221; to the &#8220;Credit Card&#8221; receipt class. But before we do this, there is one small tweak we need to make. Prior to the introduction of this patch, this profile limited assigning receipt classes to only those which were setup with a &#8220;Payment Type&#8221; of &#8220;Credit Card&#8221;. Since our receipt class does not have a type assigned, we&#8217;ll need to change the validation behind this profile so that it allows assignment of &#8220;Credit Card&#8221; and &#8220;None&#8221; payment types.</p>
<p>To do this, you&#8217;ll need access to Application Developer to open the profile definition. After logging into this responsibility, navigate to NAVIGATION_PATH and query for the &#8220;OM: Payment Method For Credit Card Transactions&#8221; profile. Upon opening the responsibility, you&#8217;ll notice a SQL validation section. Copy and paste the below code into this box:</p>
<p style="margin-left: 36pt"><em>SQL=&#8221;SELECT NAME \&#8221;Receipt Method\&#8221;<br />
, RECEIPT_METHOD_ID<br />
INTO :VISIBLE_OPTION_VALUE<br />
, ::PROFILE_OPTION_VALUE<br />
FROM AR_RECEIPT_METHODS<br />
WHERE SYSDATE &gt;= NVL( START_DATE, SYSDATE )<br />
AND SYSDATE &lt;= NVL( END_DATE,SYSDATE)<br />
AND (PAYMENT_TYPE_CODE IN (&#8217;CREDIT_CARD&#8217;,'NONE&#8217;)<br />
OR PAYMENT_TYPE_CODE IS NULL)<br />
&#8221;<br />
COLUMN=&#8221;\&#8221;Receipt Method\&#8221;(50)&#8221;</em></p>
<p>Notice the above SQL opens up the restriction so that the profile will allow both &#8220;Credit Card&#8221; and &#8220;None&#8221; types of payments. After pasting the code, save your changes, and navigate to your System Administrator responsibility (if you happen to be so lucky) and set the &#8220;OM: Payment Method For Credit Card Transactions&#8221; profile to our receipt class.</p>
<p>Now we&#8217;re in business! Let&#8217;s test our solutionâ€¦</p>
<p>To start, enter a sales order header with data you have handy. In the &#8220;Others&#8221; tab, the key fields to note are:</p>
<ul style="margin-left: 45pt">
<li>Payment Term &#8211; make sure this is set to a term setup for prepayment. If not, revert back to your OM setups to ensure a prepayment term is established.</li>
<li>Payment Type &#8211; this will be entered as &#8220;Credit Card&#8221;</li>
<li>Credit Card Number</li>
<li>Card Holder</li>
<li>Card Expiration Date</li>
<li>Approval Code &#8211; this should be the approval code issued by your 3<sup>rd</sup> party processor upon successful confirmation of the card</li>
</ul>
<p>  </p>
<p><img height="361" src="http://www.bryanthompsononline.com/oracle/wp-content/uploads/2007/08/082407_2002_CollectingC2.png" width="508" /></p>
<p>Notice that when you&#8217;re entering the credit card number that it&#8217;s fully visible. Depending upon how you&#8217;ve setup the credit card number encryption, this data will save and be replaced by &#8216;*&#8217;&#8217;s for extra security. It&#8217;s important that you communicate to your users that before saving this information that they must perform there offline processing so that they can reference the full credit card number!</p>
<p>The offline credit card processor typically provides an approval code which indicates the credit card screening was successful. Enter this approval code into the &#8220;Approval Code&#8221; field. Otherwise, in the situation where the credit card has failed, you can leave this field blank and the order will be automatically placed on &#8220;Prepayment Hold&#8221; which will prevent further processing of the order until the transaction is revisited and the hold is released.</p>
<p>After performing the offline processing, you can than proceed with entering your order lines, again, using test data you have handy.</p>
<p>After completing order line entry, it&#8217;s now time to put our solution to the test! Upon booking the order, Order Management will interface a prepayment receivable in AR indicated that the sales order has been prepaid. Results of this activity can be evaluated in the Order Messages window that appears after clicking the &#8220;Book&#8221; button. If you see a message stating &#8220;Receipt number XXX has been processed&#8221;, your test was a success!</p>
<p>Your next step is to revert back to Accounts Receivable to verify the receipt is complete and generates the proper accounting. Aside from this validation, you&#8217;re now in the position to capture credit card information in Order Management and process offline -without the need of iPayment!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bryanthompsononline.com/oracle/2007/08/24/collecting-credit-card-information-in-om-without-ipayment/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
