<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Arik Veeder Blog</title><subtitle type="html" /><id>http://blogs.microsoft.co.il/blogs/arikveeder/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/arikveeder/" /><link rel="self" type="application/atom+xml" href="http://blogs.microsoft.co.il/blogs/arikveeder/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2010-05-04T12:31:00Z</updated><entry><title>Commerce Server 2009 multi channel foundation example</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/06/10/commerce-server-2009-multi-channel-foundation-example.aspx" /><id>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/06/10/commerce-server-2009-multi-channel-foundation-example.aspx</id><published>2010-06-10T17:43:00Z</published><updated>2010-06-10T17:43:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;Lately I&amp;#39;ve returned playing a bit with CS2009 for a POC which meant to show how easy it is to interfere with the Commerce server processes and integrate them with backend systems.&lt;/p&gt;
&lt;p dir="ltr"&gt;We needed to show integration with external profile (login in the commerce environment and get some information from external resource)&amp;nbsp;&amp;nbsp; and calculation of the basket in external system (This is probably better doing in the basket \ total pipelines , but I wanted to play with the multi channel a bit).&lt;/p&gt;
&lt;p dir="ltr"&gt;First, we needed to extract information from external web service regarding the logged in user. &lt;/p&gt;
&lt;p dir="ltr"&gt;I&amp;#39;ve looked at this whitepaper which gives good example on how to achieve the profile integration :&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=ce5629ad-2473-4c25-8f89-91c8530cd764"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=ce5629ad-2473-4c25-8f89-91c8530cd764&lt;/a&gt;&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;Then we needed to manipulate the items which are inside the orderform of the user basket.&lt;/p&gt;
&lt;p dir="ltr"&gt;To do so, we wrote a class which inherits from OperationSequenceComponent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Override the Execute method&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;&amp;nbsp; public override void &lt;a title="OLE_LINK2" name="OLE_LINK2"&gt;&lt;/a&gt;&lt;a title="OLE_LINK1" name="OLE_LINK1"&gt;&lt;/a&gt;Execute(CommerceOperation operation,&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCacheDictionary operationCache,&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CommerceOperationResponse&amp;nbsp;&amp;nbsp;response)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Next, retrieves the ordergroups from the operation cache.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;OrderGroupCollection cachedOrderGroups =&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrderGroupCache.GetCachedCommerceServerOrderGroups(operationCache);&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Get the basket (at least try to)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;CommerceEntity entity = operation.TryGetSearchModel(&amp;quot;Basket&amp;quot;);&lt;/p&gt;
&lt;p dir="ltr"&gt;if (((entity != null) &amp;amp;&amp;amp; entity.ModelName.Equals(&amp;quot;Basket&amp;quot;)))&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Now loop over the ordergroups and apply changesas needed&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;foreach (OrderGroup group in cachedOrderGroups)&lt;/p&gt;
&lt;p dir="ltr"&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;if (group is Basket)&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;{&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;//create new line item&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;LineItem line = new LineItem(&amp;quot;Adventure Works Catalog&amp;quot;, &amp;quot;AW053-10&amp;quot;, &amp;quot;37&amp;quot;, 2);&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;//override some properties sa this code will run after the basket //pipline&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp; line.ExtendedPrice = 23; &lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp; line[&amp;quot;_product_Image_filename&amp;quot;] = &amp;quot;abc.png&amp;quot;;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;//or add new discount to the line item&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p dir="ltr"&gt;DiscountApplicationRecord disc = new DiscountApplicationRecord();&lt;/p&gt;
&lt;p dir="ltr"&gt;disc.BasketDisplayMessage = &amp;quot;this is generated discount&amp;quot;;&lt;/p&gt;
&lt;p dir="ltr"&gt;disc.DiscountAmount = 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p dir="ltr"&gt;line.ItemLevelDiscountsApplied.Add(disc);&lt;/p&gt;
&lt;p dir="ltr"&gt;//add the new line item&lt;/p&gt;
&lt;p dir="ltr"&gt;group.OrderForms[0].LineItems.Add(line);&lt;/p&gt;
&lt;p dir="ltr"&gt;//or remove some line prevoise&amp;nbsp; items&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p dir="ltr"&gt;group.OrderForms[0].LineItems.Remove(0);&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p dir="ltr"&gt;}&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;Now all we need is to place this at the right place in the operation sequence - since I wanted to manipulate the line items , I&amp;#39;ve put it after the Order Pipelines Processor &lt;/p&gt;
&lt;p dir="ltr"&gt;Just before the Basket Committer.&lt;/p&gt;
&lt;p dir="ltr"&gt;One thing that I&amp;#39;ve notice is that if we remove line items from the basket in the custom operation sequence and place the custom operation before &amp;quot;Line Items processor&amp;quot; component - we get an error&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type : System.ServiceModel.FaultException`1[[Microsoft.Commerce.Contracts.Faults.ItemDoesNotExistFault, Microsoft.Commerce.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/li&gt;&lt;/ul&gt;
&lt;p dir="ltr"&gt;Message : The requested item does not exist&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;The 3&lt;sup&gt;rd&lt;/sup&gt; component we needed is to export the completed order after payment&lt;/p&gt;
&lt;p dir="ltr"&gt;In the Execute method, we check: ((string)operation.Model.Properties[&amp;quot;Status&amp;quot;] == &amp;quot;&lt;b&gt;ReadyForCheckout&lt;/b&gt;&amp;quot;))&lt;/p&gt;
&lt;p dir="ltr"&gt;And in the forech section we&amp;#39;ve checked that the OrderGroup is of PurchaseOrder Type&lt;/p&gt;
&lt;p dir="ltr"&gt;foreach (OrderGroup group in cachedOrderGroups)&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (group is PurchaseOrder)&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.WriteFile(group);&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=653330" width="1" height="1"&gt;</content><author><name>arikveeder</name><uri>http://blogs.microsoft.co.il/members/arikveeder.aspx</uri></author><category term="commerce server 2009" scheme="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/commerce+server+2009/default.aspx" /><category term="multi channel foundation" scheme="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/multi+channel+foundation/default.aspx" /></entry><entry><title>Pipeline Error: Component Execution failed for component</title><link rel="alternate" type="text/html" href="http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/05/04/pipeline-error-component-execution-failed-for-component.aspx" /><id>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/05/04/pipeline-error-component-execution-failed-for-component.aspx</id><published>2010-05-04T09:31:00Z</published><updated>2010-05-04T09:31:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;Pipeline Error: Component Execution failed for component&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p dir="ltr"&gt;I&amp;#39;ve built a custom pipeline component and registered it using the RegAsm&amp;nbsp; /codebase command. Then I&amp;#39;ve register the component using the commerce server pipereg tool .&lt;/p&gt;
&lt;p dir="ltr"&gt;After adding the component to one of the pipelines and ensuring that the new component is not &amp;quot;broken&amp;quot;, I&amp;#39;ve reset the IIS and test the component. Since these steps were adequate in commerce server 2002 (my commerce server past experience), I was surprised to get the following error:&lt;/p&gt;
&lt;p dir="ltr"&gt;&lt;b&gt;&amp;quot;Component Execution failed for component [0x0]&amp;nbsp; hr: 0×80040154 ProgID: XXX Could not create Component XXX.&amp;nbsp; This may be a component registration issue.&lt;/b&gt;&amp;quot;&lt;/p&gt;
&lt;p dir="ltr"&gt;I&amp;#39;ve tried the suggestions found on this blog &lt;a href="http://microsoftblog.co.in/commerceserver/pipeline-error-component-execution-failed-for-component/"&gt;http://microsoftblog.co.in/commerceserver/pipeline-error-component-execution-failed-for-component/&lt;/a&gt;&amp;nbsp; , but with no luck.&lt;/p&gt;
&lt;p dir="ltr"&gt;Finally I&amp;#39;ve put the custom pipeline DLL in the GAC, and that solved my problem.&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=609981" width="1" height="1"&gt;</content><author><name>arikveeder</name><uri>http://blogs.microsoft.co.il/members/arikveeder.aspx</uri></author><category term="commerce server 2009" scheme="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/commerce+server+2009/default.aspx" /><category term="cs2009" scheme="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/cs2009/default.aspx" /><category term="pipeline" scheme="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/pipeline/default.aspx" /></entry></feed>
