Sitecore Commerce Connect – Teil 4: Preise darstellen

In den letzten beiden Teilen dieser Serie ging es um die Synchronisation von Produkten und Klassifizierungen. Das Ziel dieses Artikels ist es auch die Preise aus dem externen Shopsystem, in unserem Fall Hybris, auf der Webseite anzeigen zu können.

ProduktDemo

Der Pricing Layer ist ein “klassischer” Layer im Sitecore Commerce Connect, d.h. die Preise werden online abgerufen und nicht synchronisiert. Der Grund: Preise ändern sich häufiger und die Preisfindung ist sehr komplex, hier wird die Hoheit im externen Shopsystem (kurz ECS) belassen.

Preisabfragen

Für die Abfrage von Preisen ist der Service Provider ‚PricingServiceProvider‘ zuständig.

Eine Beispiel:

using System.Linq;
using Sitecore.Commerce.Entities.Prices;
using Sitecore.Commerce.Services.Prices;
using Sitecore.Globalization;

namespace Comspace.Sitecore.CommerceConnect.Services.Prices
{
	/// <summary>
	/// Sitecore.Commerce.Prices.config
	/// </summary>
	public class PriceManager
	{
		public static Price GetPrice(string productId, Language language)
		{
			CustomGetProductPriceRequest request = new CustomGetProductPriceRequest(language.Name, productId);
			GetProductPricesResult result = new PricingServiceProvider().GetProductPrices(request);

			return result.Prices.Any() ? result.Prices.First().Value : null; //simplified
		}
	}
}

Um die Preise aus dem ECS abzurufen, muss die Pipeline ‚getProductPrices‘ der Sitecore.Commerce.Prices.config erweitert werden:

Pipeline getProductPrices

.config

<!-- GET PRODUCT PRICES	Gets the price object that matches the specified criteria.
	This pipeline is responsible for reading pricing data from a commerce system.
	This pipeline requests product pricing information from the commerce system and
then converts the output into the proper Commerce format.
	-->
<commerce.prices.getProductPrices>
	<processor type="Sitecore.Commerce.Pipelines.Prices.GetProductPrices.GetProductPrices, Sitecore.Commerce">
		<patch:delete />
	</processor>
	<processor type="Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Prices.GetProductPrices, Comspace.Sitecore.CommerceConnect.Hybris" />
</commerce.prices.getProductPrices>

Processor GetProductPrices

using Comspace.Sitecore.CommerceConnect.Hybris.Connector;
using Comspace.Sitecore.CommerceConnect.Hybris.Connector.Model;
using Comspace.Sitecore.CommerceConnect.Services.Prices;
using Sitecore.Commerce.Entities.Prices;
using Sitecore.Commerce.Pipelines;
using Sitecore.Commerce.Services.Prices;

namespace Comspace.Sitecore.CommerceConnect.Hybris.Pipelines.Prices
{
	/// <summary>
	/// commerce.prices.getProductPrices
	/// </summary>
	public class GetProductPrices : PipelineProcessor<ServicePipelineArgs>
	{
		public override void Process(ServicePipelineArgs args)
		{
			var request = args.Request as CustomGetProductPriceRequest;

			//get from ECS
			ExternalProduct productSource = ProductConnector.Load(request.Language, request.ProductId);
			if (productSource != null && productSource.Price != null)
			{
				//convert to commerce connect price
				Price price = new Price
				 {
					 Amount = productSource.Price.Value,
					 CurrencyCode = productSource.Price.CurrencyIso
				 };

				//persist for next processor
				((GetProductPricesResult) args.Result).Prices.Add("List price", price); //simplified
			}
		}
	}
}

Stolpersteine

Der ‚GetProductPricesRequest‘ enthielt überraschenderweise kein Attribut für die aktuell zu synchronisierende Sprache. Daher musste dieser überschrieben werden:

using Sitecore.Commerce.Services.Prices;

namespace Comspace.Sitecore.CommerceConnect.Services.Prices
{
	/// <summary>
	/// Extendended GetProductPricesRequest.
	/// </summary>
	public class CustomGetProductPriceRequest : GetProductPricesRequest
	{
		public string Language { get; set; }

		public CustomGetProductPriceRequest(string language, string productId, params string[] priceTypeIds)
			: base(productId, priceTypeIds)
		{
			Language = language;
		}
	}
}

Resumé

Zuletzt möchte ich wieder ein paar Eindrücke und Erkenntnisse zusammenfassen:

  • Der Service Layer ist eher klein und schnell erfasst.
  • Was mir wirklich gut gefällt ist, dass die Preishoheit im ECS verbleibt.
  • In umfangreicheren Produklisten sollte zwecks Performance die Nutzung der Methode/Pipeline ‚getProductBulkPrices‘ bevorzugt werden.

Wenn ihr mehr zum Sitecore Commerce Connect wissen wollt, dann schaut mal hier:

Über Friederike Heinze

Friederike Heinze arbeitet im Team Solution Architecture bei comspace. Im Projekt ist sie für eine Überführung von Anforderungen in technische Lösungen verantwortlich. Als Sitecore Expertin beobachtet sie Neuentwicklungen und Veränderungen auch über ein Projekt hinaus.
Artikel teilen:

Verwandte Themen

Trackbacks/ Pingbacks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.