<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Arik Veeder Blog</title><link>http://blogs.microsoft.co.il/blogs/arikveeder/</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Commerce Server 2009 multi channel foundation example</title><link>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/06/10/commerce-server-2009-multi-channel-foundation-example.aspx</link><pubDate>Thu, 10 Jun 2010 17:43:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:653330</guid><dc:creator>arikveeder</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/arikveeder/rsscomments.aspx?PostID=653330</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/06/10/commerce-server-2009-multi-channel-foundation-example.aspx#comments</comments><description>&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;</description><category domain="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/commerce+server+2009/default.aspx">commerce server 2009</category><category domain="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/multi+channel+foundation/default.aspx">multi channel foundation</category></item><item><title>Pipeline Error: Component Execution failed for component</title><link>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/05/04/pipeline-error-component-execution-failed-for-component.aspx</link><pubDate>Tue, 04 May 2010 09:31:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:609981</guid><dc:creator>arikveeder</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/arikveeder/rsscomments.aspx?PostID=609981</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/arikveeder/archive/2010/05/04/pipeline-error-component-execution-failed-for-component.aspx#comments</comments><description>&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;</description><category domain="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/commerce+server+2009/default.aspx">commerce server 2009</category><category domain="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/cs2009/default.aspx">cs2009</category><category domain="http://blogs.microsoft.co.il/blogs/arikveeder/archive/tags/pipeline/default.aspx">pipeline</category></item></channel></rss>
