Example #1
0
            /// <summary>
            /// Gets the discount codes from pricing services.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>The response.</returns>
            protected override GetDiscountCodesResponse Process(GetDiscountCodesRequest request)
            {
                ThrowIf.Null(request, "request");
                ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings");

                // Create service request.
                var serviceRequest = new GetDiscountCodesServiceRequest(
                    request.OfferId, request.DiscountCode, request.Keyword, request.ActiveDate, request.QueryResultSettings);

                // Execute service request.
                var serviceResponse = this.Context.Execute <GetDiscountCodesServiceResponse>(serviceRequest);

                // If no discount codes were found then attempt the search again using Barcode
                if (serviceResponse.DiscountCodes != null && serviceResponse.DiscountCodes.Results.Count == 0)
                {
                    var scanInfo = new ScanInfo()
                    {
                        ScannedText = request.Keyword
                    };
                    var barcodeRequest = new GetBarcodeRequest(scanInfo);
                    GetBarcodeResponse getBarcodeResponse = this.Context.Runtime.Execute <GetBarcodeResponse>(barcodeRequest, this.Context);
                    Barcode            barcode            = getBarcodeResponse.Barcode;
                    if (barcode != null && barcode.Mask.MaskType == BarcodeMaskType.DiscountCode)
                    {
                        var getDiscountCodesByBarcodeServiceRequest = new GetDiscountCodesServiceRequest(
                            request.OfferId, barcode.DiscountCode, null, request.ActiveDate, request.QueryResultSettings);
                        serviceResponse = this.Context.Execute <GetDiscountCodesServiceResponse>(getDiscountCodesByBarcodeServiceRequest);
                    }
                }

                // Convert service response to response.
                return(new GetDiscountCodesResponse(serviceResponse.DiscountCodes));
            }
            /// <summary>
            /// Executes the workflow to retrieve customer information.
            /// </summary>
            /// <param name="request">The request.</param>
            /// <returns>The response.</returns>
            protected override CustomersSearchResponse Process(CustomersSearchRequest request)
            {
                ThrowIf.Null(request, "request");
                ThrowIf.Null(request.Criteria, "request.Criteria");

                var serviceRequest = new CustomersSearchServiceRequest(
                    request.Criteria,
                    request.QueryResultSettings);

                CustomersSearchServiceResponse serviceResponse = this.Context.Execute <CustomersSearchServiceResponse>(serviceRequest);

                // If no Customers were found then attempt search by barcode.
                if (serviceResponse.Customers.Results.Count == 0 && !string.IsNullOrWhiteSpace(request.Criteria.Keyword))
                {
                    var scanInfo = new ScanInfo()
                    {
                        ScannedText = request.Criteria.Keyword
                    };
                    var barcodeRequest = new GetBarcodeRequest(scanInfo);
                    GetBarcodeResponse getBarcodeResponse = this.Context.Runtime.Execute <GetBarcodeResponse>(barcodeRequest, this.Context);
                    Barcode            barcode            = getBarcodeResponse.Barcode;

                    // If barcode was a customer barcode then use result of barcode search to search for customer again.
                    if (barcode != null && barcode.Mask.MaskType == BarcodeMaskType.Customer)
                    {
                        request.Criteria.Keyword = barcode.CustomerId;
                        var customerServiceRequest = new CustomersSearchServiceRequest(
                            request.Criteria,
                            request.QueryResultSettings);

                        serviceResponse = this.Context.Execute <CustomersSearchServiceResponse>(customerServiceRequest);
                    }
                }

                return(new CustomersSearchResponse(serviceResponse.Customers));
            }
            /// <summary>
            /// Executes the workflow to get scan result.
            /// </summary>
            /// <param name="request">Instance of <see cref="GetScanResultRequest"/>.</param>
            /// <returns>Instance of <see cref="GetScanResultResponse"/>.</returns>
            protected override GetScanResultResponse Process(GetScanResultRequest request)
            {
                ThrowIf.Null(request, "request");

                var             getBarcodeRequest  = new GetBarcodeRequest(request.ScanInfo);
                var             getBarcodeResponse = this.Context.Runtime.Execute <GetBarcodeResponse>(getBarcodeRequest, this.Context);
                Barcode         barcode            = getBarcodeResponse.Barcode;
                BarcodeMaskType maskType           = barcode == null ? BarcodeMaskType.None : barcode.Mask.MaskType;
                ScanResult      result             = new ScanResult(request.ScanInfo.ScannedText)
                {
                    Barcode = barcode, MaskType = maskType
                };

                switch (maskType)
                {
                case BarcodeMaskType.Item:
                {
                    result.Product = this.GetSingleProductByItemId(barcode.ItemBarcode.ItemId, barcode.ItemBarcode.InventoryDimensionId);
                    break;
                }

                case BarcodeMaskType.Customer:
                {
                    result.Customer = this.GetCustomerById(barcode.CustomerId);
                    break;
                }

                case BarcodeMaskType.DiscountCode:
                {
                    // ScanResult.Barcode already contains discount information so no additional lookup required.
                    break;
                }

                case BarcodeMaskType.LoyaltyCard:
                {
                    result.LoyaltyCard = this.GetLoyaltyCardById(barcode.LoyaltyCardNumber);
                    result.Customer    = this.GetCustomerByLoyaltyCard(result.LoyaltyCard);
                    break;
                }

                case BarcodeMaskType.GiftCard:
                {
                    var getGiftCardRequest  = new GetGiftCardServiceRequest(barcode.GiftCardNumber);
                    var getGiftCardResponse = this.Context.Execute <GetGiftCardServiceResponse>(getGiftCardRequest);
                    result.GiftCard = getGiftCardResponse.GiftCard;
                    break;
                }

                case BarcodeMaskType.None:
                {
                    // If barcode is not found try to find entities by id with following priority: Product -> Customer -> Loyalty card.
                    result.Product = this.GetSingleProductByItemId(request.ScanInfo.ScannedText, null);
                    if (result.Product != null)
                    {
                        result.MaskType = BarcodeMaskType.Item;
                        break;
                    }

                    result.Customer = this.GetCustomerById(request.ScanInfo.ScannedText);
                    if (result.Customer != null)
                    {
                        result.MaskType = BarcodeMaskType.Customer;
                        break;
                    }

                    result.LoyaltyCard = this.GetLoyaltyCardById(request.ScanInfo.ScannedText);
                    if (result.LoyaltyCard != null)
                    {
                        result.MaskType = BarcodeMaskType.LoyaltyCard;
                        result.Customer = this.GetCustomerByLoyaltyCard(result.LoyaltyCard);
                    }

                    break;
                }

                default:
                {
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_UnSupportedType, string.Format(CultureInfo.CurrentUICulture, "The barcode type : {0} is not supported to add to transaction", maskType));
                }
                }

                return(new GetScanResultResponse(result));
            }