Commerce 9 Oktober 2015 Petter Sørby
Agenda Ytelsesforbedringer Workflow Kampanje/promotion API endringer Bonusfeature
Ytelsesforbedringer Ytelse har vært hovedfokus siste året Tidligere oppdateringer har kraftig redusert tidsforbruk Endret struktur for versjoner og kladder TID 120 100 80 60 40 20 0 7.5 9.0
Workflow Windows Workflow Foundation Enkelt å legge til egne steg Små konkrete oppgaver i hver aktivitet Brukt til raske oppgaver med definert start og stop. Ment for oppgaver som kan starte og stoppe Manglende støtte i Visual Studio Problematisk å bruke i senere versjon. Forutsetter kompilering med riktig versjon
Checkout <SequentialWorkflowActivity x:class="epicode.commerce.workflow.cartcheckoutworkflow" x:name="cartcheckoutworkflow" xmlns:ns0="clrnamespace:epicode.commerce.workflow.activities;assembly=epicode.commerce.workflow.activities, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow"> <IfElseActivity x:name="ifelseactivity1"> <IfElseBranchActivity x:name="ifelsebranchactivity1"> <IfElseBranchActivity.Condition> <CodeCondition Condition="RunProcessPayment" /> </IfElseBranchActivity.Condition> <ns0:processpaymentactivity Warnings="{x:Null}" OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" Payment="{x:Null}" x:name="processpaymentactivity1" /> </IfElseBranchActivity> </IfElseActivity> <ns0:calculatetotalsactivity x:name="calculatetotalsactivity1" OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" Warnings="{x:Null}" /> <IfElseActivity x:name="ifelseactivity2"> <IfElseBranchActivity x:name="ifelsebranchactivity2"> <IfElseBranchActivity.Condition> <CodeCondition Condition="CheckInstoreInventory" /> </IfElseBranchActivity.Condition> <ns0:adjustinstoreinventoryactivity PickupWarehouseInShipment="{ActivityBind CartCheckoutWorkflow,Path=PickupWarehouseInShipment}" Warnings="{ActivityBind CartCheckoutWorkflow,Path=Warnings}" Description="Adjusts In Store Inventory." OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" x:name="adjustinstoreinventoryactivity1" /> </IfElseBranchActivity> <IfElseBranchActivity x:name="ifelsebranchactivity3"> <ns0:adjustinventoryactivity Description="Adjusts Inventory." x:name="adjustinventoryactivity1" OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" Warnings="{x:Null}" /> </IfElseBranchActivity> </IfElseActivity> <ns0:recordpromotionusageactivity UsageStatus="Used" Warnings="{x:Null}" OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" x:name="recordpromotionusageactivity1" /> <ns0:createpurchaseorderactivity x:name="createpurchaseorderactivity1" OrderGroup="{ActivityBind CartCheckoutWorkflow,Path=OrderGroup}" Warnings="{ActivityBind CartCheckoutWorkflow,Path=Warnings}" /> </SequentialWorkflowActivity>
Activity Flow [ActivityFlowConfiguration(Name = OrderGroupWorkflowManager.CartCheckOutWorkflowName)] public class CartCheckoutActivityFlow : ActivityFlow { public override ActivityFlowRunner Configure(ActivityFlowRunner activityflow) { return activityflow.if(() => ShouldProcessPayment()).Do<ProcessPaymentActivity>().EndIf().Do<CalculateTotalsActivity>().Do<AdjustInventoryActivity>().Do<RecordPromotionUsageActivity>(); } }
ExecutionManager Registrerer ActivityFlow implementasjoner Vurderer prioritet Høyere prioritet «vinner» ved samme navn [ActivityFlowConfiguration(Name = OrderGroupWorkflowManager.CartValidateWorkflowName)] public class CartValidateActivityFlow : ActivityFlow {...} [ActivityFlowConfiguration(Name = OrderGroupWorkflowManager.CartValidateWorkflowName, Priority=1)] public class CustomCartValidateActivityFlow : ActivityFlow {...} OrderGroupWorkflowManager > ExecutionManager Sender inn cart I fremtidige versjoner vil muligens ExecutionManager brukes direkte
EPiServer.Commerce.Tools.WorkflowMigration
Workflow
Marketing Ny rabatt/kampanjestyring Enklere (mer kjent) for redaktører Forbedret testbarhet for utviklere
Marketing / Promotion (Beta) Tilgjengeliggjøre <add name="epibetausers" type="episerver.security.mappedrole, EPiServer.Framework" roles="webeditors, WebAdmins, Administrators" mode="any" /> Prosessere <Features> <add feature="workflowsvnext" state="enabled" type="mediachase.commerce.core.features.workflowsvnext" /> </Features>
Promotion/Discount Data Result Processor
Promotion Data IContent PromotionData EntryPromotion OrderPromotion ShippingPromotion Definerer egenskaper for å validere og angi rabatten
Processor PromotionProcessorBase<T> where T : PromotionData public IPromotionResult Evaluate(IOrderGroup ordergroup, PromotionData promotiondata) Validerer gyldighet av en rabatt Returnerer IPromotionResult med FulfillmentStatus NotFulfilled, SomewhatFulfilled, AlmostFulfilled, Fulfilled
Result IPromotionResult ApplyReward. Blir kalt når FulfillementStatus er Fulfilled Gjør selve beregningen/endring av handlekurven
Promotion
Nye deler av APIet Ordreobjekter IOrderRepository IOrderGroup IOrderForm IShipment ILineItem IOrderAddress «Kalkulatorer» ITaxCalculator IShippingCalculator IOrderGroupCalculator IOrderFormCalculator ILineItemCalculator
Add to cart 9.0 public void AddToCart(VariationContent variation, int quantity, IPriceService priceservice, ICurrentMarket market) { var OrderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>(); var cart = OrderRepository.Load<Cart>(GetContactId(),Cart.DefaultName).FirstOrDefault(); if (cart == null){ cart = OrderRepository.Create<Cart>(GetCommerceCustomerId(), Cart.DefaultName); cart.customername = PrincipalInfo.CurrentPrincipal.Identity.Name; var orderreference = OrderRepository.Save(cart); } var price = priceservice.getdefaultprice(market.getcurrentmarket().marketid, DateTime.UtcNow, new CatalogKey(new Guid(variation.ApplicationId), variation.code), SiteContext.Current.Currency); var lineitem = CreateLineItem(variation, quantity, price.unitprice.amount); var orderform = cart.orderforms.first(); orderform.lineitems.add(lineitem); } var index = orderform.lineitems.indexof(lineitem); cart.orderforms.first().shipments.first().addlineitemindex(index, lineitem.quantity); OrderRepository.Save(cart); cart = OrderRepository.Load<Cart>(GetCommerceCustomerId(), Cart.DefaultName).FirstOrDefault(); PromotionEngine.Run(cart); OrderRepository.Save(cart);
Add to cart 9.2 public void AddToCart(VariationContent variation, int quantity, IPriceService priceservice, ICurrentMarket market) { var OrderRepository = ServiceLocator.Current.GetInstance<IOrderRepository>(); var cart = OrderRepository.LoadOrCreate<Cart>(PrincipalInfo.CurrentPrincipal.GetContactId(), Cart.DefaultName).FirstOrDefault(); var price = PriceService.GetDefaultPrice(market.GetCurrentMarket().MarketId,DateTime.UtcNow, new CatalogKey(new Guid(variation.ApplicationId), variation.code),context.current.currency); var lineitem = CreateLineItem(variation, quantity, price.unitprice.amount); cart.forms.first().shipments.first().lineitems.add(lineitem); PromotionEngine.Run(cart); } OrderRepository.Save(cart);
OPPGAVER TIL NESTE DEPLOY! Endre startsiden Opprett artikkelside under FAQ Kontakt oss etc. Alle sider må opprettes på samtlige språk. Innhold finner du på h:\felles\...\...\...\deployment.v12.34.5 \tekster.txt
Migration Steps [ServiceConfiguration(typeof(IMigrationStep))] public class ChangeSettingsMigrationStep : IMigrationStep
Migration