Friday, February 19, 2016

Multi Org support for an Inbound Web Service

Let’s talk about a scenario today.

We have different end-users from India, USA etc logged into the web-portal for placing their orders and from the web portal they can register themselves. We have a “Create Account” Inbound Web Service which is used to create Accounts in Siebel. Whenever a new customer register himself, the web portal sends the information to AIA and then AIA invokes the Siebel’s “Create Account” WS.

The requirement is, if end-user belongs to India then the new Account created in Siebel, should be visible to Siebel users who belongs to “India” organization. If the end-user belongs to USA then the new Account created in Siebel, should be visible to Siebel users who belong to “USA” organization.

(Note: Web Portal is able to identify the Customer and able to send the Organization name to AIA and then AIA will send the Organization tag in inbound XML to Siebel)
<Organization>USA</Organization>
                                    OR
<Organization>India</Organization>

Solution:
Actually there are multiple ways to do it and with the help of Access Control mechanism which Siebel provides OOTB, this can be easily achievable.

Possible Solution 1:
Let’s take an example, there are two users. First one is assigned with the Position let’s say “Position India” and its corresponding Organization is set as “India”.
Second user is assigned with the Position let’s say “Position USA” and its corresponding Organization is set as “USA”.

Now, we all know that, as part of the OOTB solution, all the Account records created by first user on the UI will be visible in “All Contacts” view to all the application users who belong to “India”. Similarly, all the Account records created by second user will be visible in “All Contacts” view to all the application users who belong to “USA”.

The same concept can be used while invoking the Inbound WS. In Siebel, we can create two EAI user Profiles, one belongs to “India” and other one belongs to “USA” and pass-on the user credentials to the source system (AIA). While invoking the inbound WS, source system can use the appropriate login credentials according to the Organization name.

Possible Solution 2:
Siebel application user can hold multiple positions. If you are working in Siebel UI, you can navigate to Tools -> User Preferences -> Change Position view to change the position of the logged-in user. The moment you change the position, the new records that are created after that will hold the visibility according to the position’s organization.

Similarly, the same can be achieved while invoking the inbound WS. Assuming the EAI User profile, that is being used to invoke the inbound WS, will hold multiple positions let’s say 1) “Position India” and 2) “Position USA”.

Create a step in the workflow do the “Change Position”. I am not sure if there is any vanilla BS available to simulate the “Change Position” step that we can perform from UI, so here is the small script would do the task. Assuming “Organization” name is the input argument to the business service method:

function ChangePosition(Inputs, Outputs)
{
var sOrganization = Inputs.GetProperty("Organization");
 var oBO = TheApplication().GetBusObject("Change Position");
 var oBC = oBO.GetBusComp("Change Position");
 with(oBC)
 {
  ClearToQuery();
  ActivateField("Organization");
  SetViewMode(AllView);
  ExecuteQuery();
  var isRecord = FirstRecord();
  while(isRecord)
  {
   if(GetFieldValue("Organization") == sOrganization)
   {
    InvokeMethod("Change Position");
    break;
   }
   isRecord = NextRecord();
  }
 }
 oBC = null;
 oBO = null;
}

After this “Change Position” rest of the workflow execution would continue.



Wednesday, February 17, 2016

How to perform "Apply Promotion" on Order?

If you are an expert in Siebel Order Management area, you would know that the OOTB workflow "ISS Promotion WS - ApplyProductPromotion" comes very handy for the scenario where we want to apply a Promotion on an existing Quote. Meaning this workflow accepts two input process properties, and System will gives you a complete quote hierarchy with the whole Promotion structure expanded in the Quote line items.

1) ProdPromId        : RowId of the Promotion record
2) SiebelMessage   : Quote hierarchy of IO: PDS Quote

But, there is no OOTB way available to perform the same operation on Order (in one step) as we can do over Quote.

Here below are the simple steps you can include in a wrapper workflow to make this happen. The best part is this complete solution uses OOTB workflows only.

·        Create a dummy Quote in a workflow Siebel Operation step. Get the RowId of the new Quote.

Output : QuoteId

·        Create SiebelMessage of Quote using EAI Siebel Adapter.

Input:
PrimaryRowId
Process Property
QuoteId
OutputIntObjectName
Literal
PDS Quote
                                               
Output:
SiebelMessage
Output Argument
SiebelMessage

·        Invoke WF: "ISS Promotion WS – ApplyProductPromotion", by passing the RowId of Promotion record and SiebelMessage.

Input:
ProdPromId
Process Property
<Promotion Row Id>
SiebelMessage
Process Property
SiebelMessage

Output:
SiebelMessage
Output Argument
SiebelMessage

·        Invoke WF: "SIS OM Quote To Order Workflow PMT Version". This will just convert the Quote into Order.

Input:
Object Id
Process Property
QuoteId

Output:
OrderId
Output Argument
OrderHeaderId


·        Invoke WF: "SISOMBillingSubmitOrderWebService", to submit the Order to downstream system.

Input:
Fulfillment Mode
Literal
Deliver
Object Id
Process Property
OrderId
Order Number
Process Property
<Order Number>
Order Revision Number
Process Property
<Revision Number>
PageSize
Literal
1
           


Friday, August 2, 2013

Two Buttons with same Method Invoked = ShowPopup, displaying different popup applets!!

After reading the title of this post, you might have got some idea what the scenario I am going to talk about today. This is the scenario where I have two buttons exposed on the UI and both having the same Method Invoked = "ShowPopup".

Here below is the snapshot:

1.      Create SR        :           this button is being used for displaying “Create SR Popup Applet”.
2.   Create Order  :           this button is being used for displaying “Create Order Popup Applet”.

For configuring this simple requirement, you can have the following configuration:

“Create SR” Button
“Create Order” Button
Method Invoked = ShowPopup
Control User Properties
o   Popup = Create SR Popup Applet
o   Mode = Edit
Method Invoked = ShowPopup
Control User Properties
o   Popup = Create Order Popup Applet
o   Mode = Edit

No Issue till now. This pretty simple configuration would work fine!

But the problem comes in when there is a need to execute few lines of server script when each button is clicked, something like:
            If “Create SR” button clicked then
                        Set the Profile Attribute “NewEntityCreated” to “Service Request
                        Call the web service “X” to retrieve some values from other system.
                        After that display the popup applet : “Create SR Popup Applet”

            If “Create Order” button clicked then
                        Set the Profile Attribute “NewEntityCreated” to “Order Entry - Orders
                        Call the web service “Y” to retrieve some values from other system.
                        After that display the popup applet : “Create Order Popup Applet”

So, now the problem is, both button clicked will invoke the method “ShowPopup” and there is no way to identify which button is actually clicked.

Solution:
To overcome this, we have to have the different “Method Invoked” on each button.

1.      Instead of using “ShowPopup”, invoke the custom method for each button i.e.
a.      Method Invoke for “Create SR” button would be “CreateSR”.
b.      Method Invoke for “Create Order” button would be “CreateOrder”.

2.       Put the server script in PreInvokeMethod of the applet:
if(MethodName == "CreateSR")
            {
TheApplication().SetProfileAttr(“NewEntityCreated”, “Service Request”);
//         Code for calling the Web Service X
//         ……………………………………………………
//         ……………………………………………………
PopupApplet(“Create SR Popup Applet”);
                        return (CancelOperation);
            }
            if(MethodName == "CreateOrder")
            {

TheApplication().SetProfileAttr(“NewEntityCreated”, “Order Entry - Orders”);
//         Code for calling the Web Service Y
//         ……………………………………………………
//         ……………………………………………………
PopupApplet(“Create Order Popup Applet”);
                        return (CancelOperation);
            }
3.      Create a new Function as per below script:

function PopupApplet(strAppletName)
{
var oBSSLM = TheApplication().GetService("SLM Save List Service");
var psInp = TheApplication().NewPropertySet();
var psOut = TheApplication().NewPropertySet();
psInp.SetProperty("Applet Height", "400");
psInp.SetProperty("Applet Mode", "2");                          
psInp.SetProperty("Applet Name", strAppletName);
psInp.SetProperty("Applet Width", "800");
oBSSLM.InvokeMethod("LoadPopupApplet", psInp , psOut);
            }

Limitation of “SLM Save List Service” business service
If there is a requirement to display another popup applet from a button click on a Popup applet, then this business service doesn’t work and you might see the error:
View: <?> does not contain applet: <?>.(SBL-UIF-00401)

So, in this case the only choice is to either use “ShowPopup” method or if you can’t use it because of the scenario explained above (having two buttons with same Method Invoke i.e. ShowPopup) then other option is to use hijack the custom method invoked and invoke the Browser Script (for displaying popup applet) as explained here in earlier post.