示例#1
0
        /*START : BUSA 811 - Incorrect discount - Pricing issue  for Canadian site with product ID 5018265U0 & Customer 37662*/
        protected override List <PriceMatrix> GetPriceMatrixList(PricingServiceParameter pricingServiceParameter)
        {
            List <string> matrixProducts  = this.GetMatrixProducts(pricingServiceParameter);
            List <string> matrixCustomers = this.GetMatrixCustomers(pricingServiceParameter, matrixProducts);

            return(this.UnitOfWork.GetRepository <PriceMatrix>().GetTable().WhereContains <PriceMatrix, string>(o => o.ProductKeyPart, matrixProducts).WhereContains <PriceMatrix, string>(o => o.CustomerKeyPart, matrixCustomers).Where <PriceMatrix>(o => o.CurrencyCode == pricingServiceParameter.CurrencyCode).ToList <PriceMatrix>());
        }
示例#2
0
        private void ProcessSubscription(IUnitOfWork unitOfWork, CustomerOrder customerOrder, OrderLine orderLine)
        {
            ProductSubscriptionDto productSubscriptionDto = this.GetProductSubscriptionDto(orderLine);
            Subscription           subscription           = this.GetSubscription(customerOrder, orderLine, productSubscriptionDto);

            unitOfWork.GetRepository <Subscription>().Insert(subscription);
            Dictionary <Guid, PricingServiceParameter> dictionary = new Dictionary <Guid, PricingServiceParameter>();

            foreach (SubscriptionProduct subscriptionProduct in (IEnumerable <SubscriptionProduct>)orderLine.Product.SubscriptionProducts)
            {
                PricingServiceParameter serviceParameter = new PricingServiceParameter(subscriptionProduct.Product.Id)
                {
                    Product    = subscriptionProduct.Product,
                    QtyOrdered = subscriptionProduct.QtyOrdered * orderLine.QtyOrdered
                };
                dictionary.Add(subscriptionProduct.Product.Id, serviceParameter);
            }
            GetProductPricingResult productPricing = this.pricingPipeline.GetProductPricing(new GetProductPricingParameter(true)
            {
                PricingServiceParameters = (IDictionary <Guid, PricingServiceParameter>)dictionary
            });

            PipelineHelper.VerifyResults((PipeResultBase)productPricing);
            foreach (SubscriptionProduct subscriptionProduct1 in (IEnumerable <SubscriptionProduct>)orderLine.Product.SubscriptionProducts)
            {
                SubscriptionProduct subscriptionProduct = subscriptionProduct1;
                SubscriptionLine    subscriptionLine    = new SubscriptionLine()
                {
                    Product    = unitOfWork.GetRepository <Product>().Get(subscriptionProduct.Product.Id),
                    QtyOrdered = subscriptionProduct.QtyOrdered * orderLine.QtyOrdered
                };
                ProductPriceDto productPriceDto = productPricing.ProductPriceDtos.First <KeyValuePair <Guid, ProductPriceDto> >((Func <KeyValuePair <Guid, ProductPriceDto>, bool>)(o => o.Key == subscriptionProduct.Product.Id)).Value;
                subscriptionLine.Price = productPriceDto.UnitRegularPrice;
                subscription.SubscriptionLines.Add(subscriptionLine);
                //if (subscription.IncludeInInitialOrder)
                //{
                //    OrderLine orderLine1 = new OrderLine()
                //    {
                //        Description = subscriptionLine.Product.ErpDescription,
                //        UnitListPrice = productPriceDto.UnitListPrice,
                //        UnitRegularPrice = productPriceDto.UnitRegularPrice,
                //        UnitNetPrice = subscription.FixedPrice ? subscriptionLine.Price : productPriceDto.UnitNetPrice
                //    };
                //    this.orderLineUtilities.SetProduct(orderLine1, subscriptionLine.Product);
                //    this.orderLineUtilities.SetQtyOrdered(orderLine1, subscriptionLine.QtyOrdered);
                //    PipelineHelper.VerifyResults((PipeResultBase)this.cartPipeline.AddCartLine(new Insite.Cart.Services.Pipelines.Parameters.AddCartLineParameter()
                //    {
                //        Cart = customerOrder,
                //        CartLine = orderLine1
                //    }));
                //}
            }
            if (!subscription.IncludeInInitialOrder)
            {
                return;
            }
            subscription.CustomerOrders.Add(customerOrder);
        }
示例#3
0
        protected override void SalePriceCheck(PricingServiceParameter pricingServiceParameter, PriceAndPriceBreaks priceAndBreaks, IList <PriceMatrix> priceMatrixList)
        {
            PriceMatrix selectedPriceMatrix = GetMatchedPriceMatrix(priceMatrixList);

            if (selectedPriceMatrix != null)
            {
                List <ProductPrice> list         = this.GetProductPrice(priceMatrixList, pricingServiceParameter, selectedPriceMatrix, false).ToList <ProductPrice>();
                ProductPrice        productPrice = null;
                if (this.OrderLine != null && !string.IsNullOrEmpty(this.OrderLine.SmartPart))
                {
                    if (Convert.ToDecimal(this.OrderLine.SmartPart) > 0)
                    {
                        productPrice = list.OrderByDescending <ProductPrice, Decimal>((Func <ProductPrice, Decimal>)(pb => pb.BreakQty)).FirstOrDefault <ProductPrice>((Func <ProductPrice, bool>)(b => b.BreakQty <= Convert.ToDecimal(this.OrderLine.SmartPart)));
                    }
                }
                else
                {
                    productPrice = list.OrderByDescending <ProductPrice, Decimal>((Func <ProductPrice, Decimal>)(pb => pb.BreakQty)).FirstOrDefault <ProductPrice>((Func <ProductPrice, bool>)(b => b.BreakQty <= pricingServiceParameter.QtyOrdered));
                }
                if (productPrice != null && productPrice.Price < priceAndBreaks.Price)
                {
                    priceAndBreaks.SetPrice(productPrice.Price, pricingServiceParameter.CurrencyCode);
                    priceAndBreaks.IsSalePrice = true;
                }
                priceAndBreaks.PriceBreaks = this.MergePriceBreaks(priceAndBreaks.PriceBreaks, list);
            }
            else
            {
                DateTimeOffset pricingDate1 = pricingServiceParameter.PricingDate;
                DateTimeOffset?nullable     = this.Product.BasicSaleStartDate;
                if ((nullable.HasValue ? (pricingDate1 > nullable.GetValueOrDefault() ? 1 : 0) : 0) == 0)
                {
                    return;
                }
                nullable = this.Product.BasicSaleEndDate;
                if (nullable.HasValue)
                {
                    DateTimeOffset pricingDate2 = pricingServiceParameter.PricingDate;
                    nullable = this.Product.BasicSaleEndDate;
                    if ((nullable.HasValue ? (pricingDate2 < nullable.GetValueOrDefault() ? 1 : 0) : 0) == 0)
                    {
                        return;
                    }
                }
                if (!(priceAndBreaks.Price == Decimal.Zero) && (!(priceAndBreaks.Price > Decimal.Zero) || !(priceAndBreaks.Price > this.Product.BasicSalePrice)) || !(pricingServiceParameter.UnitOfMeasure == this.Product.UnitOfMeasure))
                {
                    return;
                }
                priceAndBreaks.SetPrice(this.Product.BasicSalePrice, this.BaseCurrency.CurrencyCode);
                priceAndBreaks.IsSalePrice = true;
            }
        }
示例#4
0
        /*END  : BUSA 811 - Incorrect discount - Pricing issue  for Canadian site with product ID 5018265U0 & Customer 37662*/

        //Pricing 2018 get PriceMatrix
        protected virtual List <PriceMatrix> GetPriceMatrixList_Brasseler(PricingServiceParameter pricingServiceParameter)
        {
            var QtyBrkCls = this.Product.PriceBasis;

            if (!string.IsNullOrEmpty(QtyBrkCls))
            {
                return(this.UnitOfWork.GetRepository <PriceMatrix>().GetTable().Where(x => x.ProductKeyPart == QtyBrkCls && x.CustomerKeyPart == "1" && x.CurrencyCode == "CAD").ToList <PriceMatrix>());
            }
            else
            {
                return(this.UnitOfWork.GetRepository <PriceMatrix>().GetTable().Where(x => x.ProductKeyPart == this.Product.Name && x.CustomerKeyPart == "1" && x.CurrencyCode == "CAD").ToList <PriceMatrix>());
            }
        }
示例#5
0
        //BUSA-472 : Duplicate Customers on Production Ends

        protected override Decimal GetBasePrice(PricingServiceParameter pricingServiceParameter)
        {
            decimal basePrice      = 0;
            var     basePriceCount = UnitOfWork.GetRepository <ProductCurrencyMappingBrasseler>().GetTable().Where(x => x.ProductId == this.Product.Id).Count();

            if (basePriceCount == 0)
            {
                LogHelper.For(this).Info("Missing Canada price for #" + this.Product.Name);
                basePrice = 9999; // set Price
                return(basePrice);
            }
            basePrice = UnitOfWork.GetRepository <ProductCurrencyMappingBrasseler>().GetTable().Where(x => x.ProductId == this.Product.Id).FirstOrDefault().BasicListPrice;
            return(basePrice);
        }
示例#6
0
        protected override List <string> GetMatrixProducts(PricingServiceParameter pricingServiceParameter)
        {
            List <string> stringList = new List <string>()
            {
                this.Product.Id.ToString()
            };
            var productContrCode = this.Product.CustomProperties.Where(p => p.Name.EqualsIgnoreCase("ProductContractCode")).FirstOrDefault();

            if (productContrCode != null && !string.IsNullOrEmpty(productContrCode.Value) && !stringList.Contains(productContrCode.Value))
            {
                stringList.Add(productContrCode.Value);
            }
            if (!this.Product.ProductCode.IsBlank() && !stringList.Contains(this.Product.ProductCode))
            {
                stringList.Add(this.Product.ProductCode);
                // BUSA-555 : Pricing issue for Customer 1061091 TLC FOR SMILES Starts
                if (!string.IsNullOrEmpty(this.Product.ProductCode))
                {
                    stringList.Add(this.Product.ProductCode.Substring(0, (this.Product.ProductCode.Length) - 2));
                }
                // BUSA-555 : Pricing issue for Customer 1061091 TLC FOR SMILES Ends
            }
            return(stringList);
        }
示例#7
0
        public override PricingServiceResult ProcessPriceCalculation(PricingServiceParameter pricingServiceParameter)
        {
            //var useVolumeGroupPricing = UnitOfWork.GetTypedRepository<IWebsiteConfigurationRepository>().GetOrCreateByName<string>("UseVolumeGroupPricing", SiteContext.Current.Website.Id).ToString();
            var useVolumeGroupPricing = customSettings.Value.UseVolumeGroupPricing;

            if (useVolumeGroupPricing.ToUpper() == "TRUE")
            {
                priceBasisList = new List <string>()
                {
                    "P1", "P2", "P3", "P4", "P5", "P6", "L"
                };
            }
            else
            {
                priceBasisList = new List <string>()
                {
                    "P1", "P2", "P3", "P4", "P5", "P6"
                };
            }

            PricingServiceResult result;

            this.SetRecordTypePriority();
            List <PriceMatrix>  priceMatrixList      = this.GetPriceMatrixList(pricingServiceParameter);
            PriceAndPriceBreaks priceAndPriceBreaks1 = this.GetPriceAndPriceBreaks((IList <PriceMatrix>)priceMatrixList, pricingServiceParameter, true);

            this.ListPricing = priceAndPriceBreaks1;
            PriceAndPriceBreaks priceAndPriceBreaks2 = this.GetPriceAndPriceBreaks((IList <PriceMatrix>)priceMatrixList, pricingServiceParameter, false);

            this.PerformCurrencyConversion(pricingServiceParameter.CurrencyCode, priceAndPriceBreaks1);
            this.PerformCurrencyConversion(pricingServiceParameter.CurrencyCode, priceAndPriceBreaks2);
            result = new PricingServiceResult()
            {
                UnitListPrice          = priceAndPriceBreaks1.Price,
                UnitListBreakPrices    = (IList <ProductPrice>)priceAndPriceBreaks1.PriceBreaks,
                UnitRegularPrice       = priceAndPriceBreaks2.Price,
                UnitRegularBreakPrices = (IList <ProductPrice>)priceAndPriceBreaks2.PriceBreaks,
                IsOnSale     = priceAndPriceBreaks2.IsSalePrice,
                CurrencyRate = priceAndPriceBreaks1.CurrencyRate
            };

            //Pricing 2018 changes
            if (SiteContext.Current.ShipTo != null && useVolumeGroupPricing.ToUpper() == "TRUE")
            {
                var customer = !string.IsNullOrEmpty(SiteContext.Current.ShipTo.CustomerSequence) ? SiteContext.Current.ShipTo : SiteContext.Current.BillTo;

                var DefaultPriceList = customer.CustomProperties.Where(p => p.Name.EqualsIgnoreCase("DefaultPriceList")).FirstOrDefault().Value;

                if (result.UnitRegularPrice == result.UnitListPrice && !string.IsNullOrEmpty(DefaultPriceList) && DefaultPriceList == "1")
                {
                    List <PriceMatrix>  volumePriceMatrixList      = GetPriceMatrixList_Brasseler(pricingServiceParameter);
                    PriceAndPriceBreaks volumePriceAndPriceBreaks1 = this.GetPriceAndPriceBreaks((IList <PriceMatrix>)volumePriceMatrixList, pricingServiceParameter, true);
                    this.ListPricing = volumePriceAndPriceBreaks1;
                    PriceAndPriceBreaks volumePriceAndPriceBreaks2 = this.GetPriceAndPriceBreaks((IList <PriceMatrix>)volumePriceMatrixList, pricingServiceParameter, false);
                    this.PerformCurrencyConversion(pricingServiceParameter.CurrencyCode, volumePriceAndPriceBreaks1);
                    this.PerformCurrencyConversion(pricingServiceParameter.CurrencyCode, volumePriceAndPriceBreaks2);
                    PricingServiceResult volumePricingServiceResult = new PricingServiceResult();
                    volumePricingServiceResult.UnitListPrice          = volumePriceAndPriceBreaks1.Price;
                    volumePricingServiceResult.UnitListBreakPrices    = (IList <ProductPrice>)volumePriceAndPriceBreaks1.PriceBreaks;
                    volumePricingServiceResult.UnitRegularPrice       = volumePriceAndPriceBreaks2.Price;
                    volumePricingServiceResult.UnitRegularBreakPrices = (IList <ProductPrice>)volumePriceAndPriceBreaks2.PriceBreaks;
                    int num1 = volumePriceAndPriceBreaks2.IsSalePrice ? 1 : 0;
                    volumePricingServiceResult.IsOnSale = num1 != 0;
                    Decimal volumeCurrencyRate = volumePricingServiceResult.CurrencyRate;
                    volumePricingServiceResult.CurrencyRate = volumeCurrencyRate;
                    result = volumePricingServiceResult;
                }
            }
            this.AddDisplayPrices(result, this.GetCurrency(pricingServiceParameter.CurrencyCode));
            this.AddExtendedPrices(pricingServiceParameter, result, this.GetCurrency(pricingServiceParameter.CurrencyCode));
            return(result);
        }
示例#8
0
        protected override IEnumerable <ProductPrice> GetProductPrice(IList <PriceMatrix> priceMatrixList, PricingServiceParameter pricingServiceParameter, PriceMatrix selectedPriceMatrix, bool regularPrice)
        {
            List <ProductPrice> productPriceList = new List <ProductPrice>();
            List <PriceBracket> matrixBrackets   = this.GetMatrixBrackets(selectedPriceMatrix);
            CurrencyDto         currency         = this.GetCurrency(selectedPriceMatrix.CurrencyCode);
            Decimal             basePrice        = this.GetBasePrice(pricingServiceParameter);

            foreach (PriceBracket priceBracket1 in matrixBrackets)
            {
                PriceData priceData1 = new PriceData();
                priceData1.PricingServiceParameter = pricingServiceParameter;
                Product product = this.Product;
                priceData1.Product = product;
                Customer billTo = this.BillTo;
                priceData1.BillTo = billTo;
                Customer shipTo = GetSiteContextShipTo();//BUSA-42 : Duplicate Customers on Production.
                priceData1.ShipTo = shipTo;
                List <PriceBracket> priceBracketList = matrixBrackets;
                priceData1.MatrixBrackets = priceBracketList;
                PriceBracket priceBracket2 = priceBracket1;
                priceData1.PriceBracket = priceBracket2;
                if (selectedPriceMatrix.RecordType.EqualsIgnoreCase("Product"))
                {
                    var priceBracket = GetAllCustomerItemPriceBracket();
                    if (priceBracket != null)
                    {
                        priceData1.PriceBracket.AdjustmentType = priceBracket.AdjustmentType;
                        priceData1.PriceBracket.PriceBasis     = priceBracket.PriceBasis;
                        priceData1.PriceBracket.Amount         = priceBracket.Amount;
                        priceData1.PriceBracket.AltAmount      = priceBracket.AltAmount;
                    }
                }
                Decimal num = basePrice;
                priceData1.BasePrice = num;
                string calculationFlags = selectedPriceMatrix.CalculationFlags;
                priceData1.CalculationFlags = calculationFlags;
                if (selectedPriceMatrix.RecordType.EqualsIgnoreCase("Product"))
                {
                    priceData1.TempBasis = priceData1.PriceBracket.AltAmount;
                }
                else
                {
                    priceData1.TempBasis = this.GetTempBasisValue(priceBracket1.PriceBasis, priceMatrixList, pricingServiceParameter, regularPrice);
                }
                PriceData         priceData        = priceData1;
                IPriceCalculation priceCalculation = this.PriceCalculations.FirstOrDefault <IPriceCalculation>((Func <IPriceCalculation, bool>)(r => r.IsMatch(priceData)));
                if (priceCalculation != null)
                {
                    ProductPrice productPrice = new ProductPrice();
                    productPrice.BreakQty = priceData.PriceBracket.BreakQty;
                    if (regularPrice)
                    {
                        //Start:Revert BUSA 682 :The Base price of the product in ERP and the base price of the same product on the PDP are different.Revert BUSA: 696 Acct #78803:1076826 - Product (5011768U0) price differs in ERP and on the PDP.
                        var price = GetPriceListAmount("P2");
                        productPrice.Price = !string.IsNullOrEmpty(price) ? Convert.ToDecimal(price) : this.GetBasePrice(pricingServiceParameter);
                        //productPrice.Price = !string.IsNullOrEmpty(price) ? Convert.ToDecimal(price) : this.Product.BasicListPrice;

                        //End:Revert BUSA 682 :The Base price of the product in ERP and the base price of the same product on the PDP are different.Revert BUSA: 696 Acct #78803:1076826 - Product (5011768U0) price differs in ERP and on the PDP.
                    }
                    else
                    {
                        productPrice.Price = priceCalculation.CalculatePrice(priceData);
                    }

                    productPrice.Price        = this.ApplyProductMultiplier(pricingServiceParameter, productPrice.Price);
                    productPrice.Price        = selectedPriceMatrix.UnitOfMeasure == pricingServiceParameter.UnitOfMeasure || selectedPriceMatrix.UnitOfMeasure.IsBlank() && pricingServiceParameter.UnitOfMeasure == this.Product.UnitOfMeasure || priceBracket1.PriceBasis.Equals("CLM", StringComparison.OrdinalIgnoreCase) ? productPrice.Price : this.AdjustForUnitOfMeasure(pricingServiceParameter, productPrice.Price);
                    productPrice.PriceDisplay = this.CurrencyFormatProvider.GetString(productPrice.Price, currency);
                    productPriceList.Add(productPrice);
                }
            }
            return(productPriceList);
        }
示例#9
0
        protected override PriceAndPriceBreaks GetPriceAndPriceBreaks(IList <PriceMatrix> priceMatrixList, PricingServiceParameter pricingServiceParameter, bool regularPrice)
        {
            PriceAndPriceBreaks priceAndPriceBreaks = new PriceAndPriceBreaks()
            {
                PriceBreaks = new List <ProductPrice>(),
                IsSalePrice = false
            };

            this.SetupRecordTypeMatrixQueries(pricingServiceParameter, regularPrice);
            this.SetupCommonMatrixQueries(pricingServiceParameter, regularPrice);
            this.SelectedPriceMatrix = GetMatchedPriceMatrix(priceMatrixList);
            if (this.SelectedPriceMatrix == null || this.GetPriceBracketByQty(this.SelectedPriceMatrix, pricingServiceParameter.QtyOrdered) == null)
            {
                this.SetBasicPricing(priceAndPriceBreaks, pricingServiceParameter, regularPrice);
                priceAndPriceBreaks.PriceBreaks = this.GetBreakPrices(this.SelectedPriceMatrix, this.GetCurrency(priceAndPriceBreaks.CurrencyCode));
            }
            else
            {
                IEnumerable <ProductPrice> productPrice1 = this.GetProductPrice(priceMatrixList, pricingServiceParameter, this.SelectedPriceMatrix, regularPrice);
                priceAndPriceBreaks.PriceBreaks.AddRange(productPrice1);

                ProductPrice productPrice2 = null;
                if (this.OrderLine != null && !string.IsNullOrEmpty(this.OrderLine.SmartPart))
                {
                    if (Convert.ToDecimal(this.OrderLine.SmartPart) > 0)
                    {
                        productPrice2 = priceAndPriceBreaks.PriceBreaks.OrderByDescending <ProductPrice, Decimal>((Func <ProductPrice, Decimal>)(pb => pb.BreakQty)).FirstOrDefault <ProductPrice>((Func <ProductPrice, bool>)(b => b.BreakQty <= pricingServiceParameter.QtyOrdered));
                    }
                }
                else
                {
                    productPrice2 = priceAndPriceBreaks.PriceBreaks.OrderByDescending <ProductPrice, Decimal>((Func <ProductPrice, Decimal>)(pb => pb.BreakQty)).FirstOrDefault <ProductPrice>((Func <ProductPrice, bool>)(b => b.BreakQty <= pricingServiceParameter.QtyOrdered));
                }
                if (productPrice2 != null)
                {
                    priceAndPriceBreaks.SetPrice(productPrice2.Price, pricingServiceParameter.CurrencyCode);
                }
            }
            if (!regularPrice)
            {
                this.SalePriceCheck(pricingServiceParameter, priceAndPriceBreaks, priceMatrixList);
            }
            this.ZeroPriceCheck(priceAndPriceBreaks, pricingServiceParameter, priceMatrixList);
            this.ConfigurePrice(pricingServiceParameter, priceAndPriceBreaks);
            this.AdvancedConfigurationPrice(pricingServiceParameter, priceAndPriceBreaks);
            if (priceAndPriceBreaks.Price <= Decimal.Zero)
            {
                priceAndPriceBreaks = this.CheckUnitOfMeasurePricing(priceMatrixList, pricingServiceParameter, priceAndPriceBreaks, regularPrice);
            }
            return(priceAndPriceBreaks);
        }
示例#10
0
        protected override Decimal GetTempBasisValue(string priceBasis, IList <PriceMatrix> priceMatrixList, PricingServiceParameter pricingServiceParameter, bool regularPrice)
        {
            Decimal num = new Decimal();

            if (priceBasis.IsBlank())
            {
                return(num);
            }
            if (!string.IsNullOrEmpty(priceBasis) && priceBasisList.Contains(priceBasis, StringComparer.OrdinalIgnoreCase))
            {
                var altAmount = GetPriceListAmount(priceBasis);
                if (!string.IsNullOrEmpty(altAmount) && decimal.TryParse(altAmount, out num))
                {
                    return(num);
                }
            }
            return(num);
        }