Note: Implemented with Dynamics 365 version 7.2.11792.62628, or App Update 4 (should work with many other versions). Sample code can be downloaded at the end of this blog.
Imagine there is some additional business logic that should be executed during “AddToCart” in order to cancel the operation and show a dialog in POS (both ModernPOS or CloudPOS). It could be that an external system has some additional information about item availability, or it could be a credit check that the customer on the transaction failed. Whatever the actual business logic may be, our code extension shall meet these goals:
- If a certain condition is true, do not persist the new cart item,
- show a well-formed, localized error message in POS about the issue, and
- keep the existing POS view open, with unchanged data, after the dialog is closed.
This can be accomplished with a very small extension in CRT and without any changes in POS. The CRT request in charge of saving the cart data is “SaveCartVersionedDataRequest”. All we need to do is to augment the CRT request with a pre-trigger that will give us the opportunity to “cancel” before saving the cart. Steps:
-
- Create a simple new CRT trigger and implement the interface methods
class MyAddToCartLineValidationTrigger : IRequestTrigger { public IEnumerable SupportedRequestTypes { get { return new[] { typeof(SaveCartVersionedDataRequest), }; } } public void OnExecuted(Request request, Response response) { } public void OnExecuting(Request request)
-
- add business logic to validate any data on the cart or transaction
- if you need to invalidate/cancel the “AddToCart” because the business rules call for it, throw a CommerceException with localized message
if (invalidCart) { throw new CommerceException("Microsoft_Dynamics_Commerce_30104", "Custom error") { LocalizedMessage = string.Format("The item with Id {0} is not allowed to be added at this time.", disallowedItemId), LocalizedMessageParameters = new object[] { disallowedItemId } }; }
- Add your changes to the Retail Sdk, edit the commerceruntime.exe.config, global.prop or Customization.settings files