示例#1
0
        /// <summary>
        /// Converts a line item of one type to a line item of another type while preserving the key.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <typeparam name="T">
        /// The type of the line item
        /// </typeparam>
        /// <returns>
        /// The <see cref="T"/>.
        /// </returns>
        public static T AsLineItemWithKeyOf <T>(this ILineItem lineItem) where T : class, ILineItem
        {
            var clone = lineItem.AsLineItemOf <T>();

            clone.Key = lineItem.Key;
            return(clone);
        }
示例#2
0
        public static string GetFullUrl(this ILineItem lineItem)
        {
            var rightUrl = lineItem.GetUrl();
            var baseUrl  = _httpContextAccessor.Value.HttpContext.Request.PathBase;

            return(new Uri(new Uri(baseUrl), rightUrl).ToString());
        }
示例#3
0
 /// <summary>
 /// True/false indicating whether or not this lineItem represents a line item that can be shipped (a product)
 /// </summary>
 /// <param name="lineItem">
 /// The <see cref="ILineItem"/>
 /// </param>
 /// <returns>
 /// True or false indicating whether or not this line item represents a shippable line item
 /// </returns>
 public static bool IsShippable(this ILineItem lineItem)
 {
     return(lineItem.LineItemType == LineItemType.Product &&
            lineItem.ExtendedData.ContainsProductVariantKey() &&
            lineItem.ExtendedData.GetShippableValue() &&
            lineItem.ExtendedData.ContainsWarehouseCatalogKey());
 }
        /// <summary>
        /// Visits the line items to apply expression.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param> 
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product)
            {
                _filteredItems.Add(lineItem);
                return;
            }

            // gets the product key from the line item extended data
            var productKey = lineItem.ExtendedData.GetProductKey();

            if (productKey.Equals(Guid.Empty)) return;

            // look for a matching value in the constraints collection
            var found = _constraints.FirstOrDefault(x => x.ProductKey == productKey);
            if (found == null) return;

            // if this constraint does not specified variants add it to the filtered collection
            if (!found.SpecifiedVariants)
            {
                _filteredItems.Add(lineItem);
                return;
            }

            // check the product variant key
            var productVariantKey = lineItem.ExtendedData.GetProductVariantKey();

            if (productVariantKey.Equals(Guid.Empty)) return;

            var foundVariant = found.VariantKeys.FirstOrDefault(x => x == productVariantKey);

            // add the line item to the collection if the variant key is found
            if (!foundVariant.Equals(Guid.Empty)) _filteredItems.Add(lineItem);
        }
        private string GetTaxNewSchool(ShirtVariation currentContent)
        {
            IMarket market    = _currentMarket.GetCurrentMarket();
            Guid    currCust  = CustomerContext.Current.CurrentContactId;
            string  bogusCart = "BogusCart";

            ICart cart = _orderRepository.LoadOrCreateCart <ICart>(
                currCust, bogusCart);

            ILineItem lineItem = _orderGroupFactory.CreateLineItem(currentContent.Code, cart);

            lineItem.Quantity      = 1;
            lineItem.PlacedPrice   = GetCustomerPricingPrice(currentContent).UnitPrice.Amount;
            lineItem.TaxCategoryId = currentContent.TaxCategoryId;
            cart.AddLineItem(lineItem);

            IOrderAddress bogusAddress = _orderGroupFactory.CreateOrderAddress(cart);

            bogusAddress.CountryCode = "sv";
            bogusAddress.City        = "Stockholm";
            bogusAddress.CountryName = "Sweden";

            string str = String.Empty;
            //str += _taxCalc.Service.GetTaxTotal(cart, market, market.DefaultCurrency).Amount.ToString();

            var taxValues = Enumerable.Empty <ITaxValue>();

            taxValues = OrderContext.Current.GetTaxes(Guid.Empty, currentContent.theTaxCategory, "sv", bogusAddress);

            str = _taxCalc.Service.GetSalesTax(lineItem, market, bogusAddress, new Money(0m, "SEK")).ToString();


            return(str);
        }
        private static ICart UpdateQuantity(this ICart cart, ILineItem lineItem, int quantity)
        {
            var shipment = cart.GetFirstShipment();

            cart.UpdateLineItemQuantity(shipment, lineItem, lineItem.Quantity + quantity);
            return(cart);
        }
示例#7
0
 public LineItemsController(ILineItem context, ApplicationDbContext user, ProductDBContext dbContext, UserManager <ApplicationUser> userManager)
 {
     _context     = context;
     _user        = user;
     _dbContext   = dbContext;
     _userManager = userManager;
 }
示例#8
0
        public HttpResponseMessage DeleteDiscount(Guid invoiceId, string discountSku)
        {
            var invoice = _invoiceService.GetByKey(invoiceId);

            if (invoice == null)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            // Remove discount
            ILineItem discountToDelete = null;

            foreach (var invoiceItem in invoice.Items)
            {
                if (invoiceItem.Sku == discountSku)
                {
                    discountToDelete = invoiceItem;
                    break;
                }
            }

            if (discountToDelete != null)
            {
                // Remove discount
                invoice.Items.Remove(discountToDelete);

                // Resync the invoice (And save)
                ((InvoiceService)_invoiceService).ReSyncInvoiceTotal(invoice, true);
            }

            return(Request.CreateResponse(HttpStatusCode.OK));
        }
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Discount)
            {
                return;
            }
            if (!lineItem.ExtendedData.ContainsKey(Core.Constants.ExtendedDataKeys.CouponReward))
            {
                return;
            }

            var json          = lineItem.ExtendedData.GetValue(Core.Constants.ExtendedDataKeys.CouponReward);
            var offerSettings = JsonConvert.DeserializeObject <OfferSettingsDisplay>(json);

            var offerRedeemed = new OfferRedeemed(
                offerSettings.OfferCode,
                offerSettings.OfferProviderKey,
                lineItem.ContainerKey,
                offerSettings.Key);

            offerRedeemed.CustomerKey = _customerKey;

            offerRedeemed.ExtendedData.SetValue(Core.Constants.ExtendedDataKeys.CouponReward, json);

            _redemptions.Add(offerRedeemed);
        }
示例#10
0
        /// <summary>
        /// Builds a <see cref="BasketLineItem"/>
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <returns>
        /// The <see cref="BasketLineItem"/>.
        /// </returns>
        public BasketLineItem Build(ILineItem lineItem)
        {
            var contentId = lineItem.ExtendedData.ContainsKey("umbracoContentId")
                                ? int.Parse(lineItem.ExtendedData["umbracoContentId"])
                                : 0;

            var productKey = lineItem.ExtendedData.GetProductKey();
            ProductModel product = null;
            if (!productKey.Equals(Guid.Empty))
            {
                var productContent = _merchello.TypedProductContent(productKey);  
                if (productContent != null) product = new ProductModel(productContent)
                                                          {
                                                              CurrentCustomer = _currentCustomer,
                                                              Currency = _currency
                                                          };
            }
            

            var basketLineItem = new BasketLineItem
                {
                    Key = lineItem.Key,
                    ContentId = contentId,
                    Name = lineItem.Name,
                    Sku = lineItem.Sku,
                    UnitPrice = lineItem.Price,
                    TotalPrice = lineItem.TotalPrice,
                    Quantity = lineItem.Quantity,
                    ExtendedData = lineItem.ExtendedData,
                    Product = product ?? this.HandleLegacyBazaarProductContent(contentId)
                };

            return basketLineItem;
        }
示例#11
0
        public static ITypeField GetTypeField(this ILineItem lineItem)
        {
            var type      = EnumTypeFieldConverter.LineItemType.GetTypeField(lineItem.LineItemTfKey);
            var typeField = EnumTypeFieldConverter.LineItemType.Product;

            switch (type)
            {
            case LineItemType.Custom:
                typeField =
                    EnumTypeFieldConverter.LineItemType.CustomTypeFields.FirstOrDefault(
                        x => x.TypeKey.Equals(lineItem.LineItemTfKey));
                break;

            case LineItemType.Discount:
                typeField = EnumTypeFieldConverter.LineItemType.Discount;
                break;

            case LineItemType.Product:
                typeField = EnumTypeFieldConverter.LineItemType.Product;
                break;

            case LineItemType.Tax:
                typeField = EnumTypeFieldConverter.LineItemType.Tax;
                break;

            case LineItemType.Shipping:
                typeField = EnumTypeFieldConverter.LineItemType.Shipping;
                break;
            }

            return(typeField);
        }
示例#12
0
        /// <summary>
        /// Gets the option choice pairs for a variant added as a basket item.
        /// </summary>
        /// <param name="lineItem">
        /// The <see cref="ILineItem"/>.
        /// </param>
        /// <returns>
        /// The option choice pairs for a variant added to the basket.
        /// </returns>
        public static Dictionary <string, string> GetProductOptionChoicePairs(this ILineItem lineItem)
        {
            var values =
                lineItem.ExtendedData.GetValue <Dictionary <string, string> >(Core.Constants.ExtendedDataKeys.BasketItemCustomerChoice);

            return(values ?? new Dictionary <string, string>());
        }
        public virtual OmniumOrderLine MapOrderLine(
            ILineItem lineItem, IMarket market, Currency currency, IOrderAddress address)
        {
            var marketId = market.MarketId;

            var taxTotal = _lineItemCalculator.GetSalesTax(lineItem, market, currency, address);
            var taxRate  = _taxUtility.GetTaxValue(marketId, address, TaxType.SalesTax, lineItem.TaxCategoryId);

            var placedPrice      = _taxUtility.GetPriceTax(lineItem, market, currency, address, lineItem.PlacedPrice);
            var discountedAmount = _taxUtility.GetPriceTax(lineItem, market, currency, address, lineItem.GetDiscountTotal(currency)); //all discounts (line item + coupon code)
            var extendedPrice    = _taxUtility.GetPriceTax(lineItem, market, currency, address, _lineItemCalculator.GetExtendedPrice(lineItem, currency));
            var discountedPrice  = _taxUtility.GetPriceTax(lineItem, market, currency, address, _lineItemCalculator.GetDiscountedPrice(lineItem, currency));

            var omniumOrderLine2 = new OmniumOrderLine
            {
                Code                   = lineItem.Code,
                ProductId              = GetProductCode(lineItem.Code),
                DisplayName            = lineItem.DisplayName,
                PlacedPrice            = placedPrice.PriceInclTax,
                PlacedPriceExclTax     = placedPrice.PriceExclTax,
                ExtendedPrice          = extendedPrice.PriceInclTax,
                ExtendedPriceExclTax   = extendedPrice.PriceExclTax,
                DiscountedPrice        = discountedPrice.PriceInclTax,
                DiscountedPriceExclTax = discountedPrice.PriceExclTax,
                Discounted             = discountedAmount.PriceInclTax,
                DiscountedExclTax      = discountedAmount.PriceExclTax,
                TaxTotal               = taxTotal,
                TaxRate                = (decimal)taxRate,
                LineItemId             = lineItem.LineItemId.ToString(),
                Quantity               = lineItem.Quantity,
                Properties             = lineItem.ToPropertyList()
            };

            return(omniumOrderLine2);
        }
示例#14
0
        protected virtual ILineItem CreateLineItem(
            IPurchaseOrder purchaseOrder,
            IShipment shipment,
            SaleViewModel kachingSale,
            SaleLineItemViewModel kachingLineItem)
        {
            ILineItem lineItem = _orderGroupFactory.CreateLineItem(
                kachingLineItem.VariantId.DesanitizeKey() ?? kachingLineItem.Id.DesanitizeKey(),
                purchaseOrder);

            decimal quantity = kachingLineItem.UnitCount ?? kachingLineItem.Quantity;

            lineItem.Quantity    = quantity;
            lineItem.PlacedPrice = kachingLineItem.RetailPrice / quantity;

            // Get the specific discount amount of this line item (discount that were applied directly to the line item).
            decimal lineItemDiscount =
                kachingLineItem.Discounts?
                .Where(d => !(d.Discount?.Application.Basket ?? false))
                .Sum(d => d.Amount) ?? 0;

            // Get the amount of the order level discount that this line item contributes
            // (the order level discount are spread out on all line items).
            decimal orderLevelDiscount =
                kachingLineItem.Discounts?
                .Where(d => d.Discount?.Application.Basket ?? false)
                .Sum(d => d.Amount) ?? 0;

            lineItem.SetEntryDiscountValue(lineItemDiscount);
            lineItem.SetOrderDiscountValue(orderLevelDiscount);

            return(lineItem);
        }
示例#15
0
 /// <summary>
 /// Populates default fields on the first line item. Override to populate custom line item fields.
 /// </summary>
 protected virtual void PopulateMetaFields(
     ILineItem lineItem,
     IMarket market,
     SaleViewModel kachingSale,
     SaleLineItemViewModel kachingLineItem)
 {
 }
示例#16
0
        private CartActionResult AddToCart(string name, LineItem lineItem)
        {
            string code = lineItem.Code;

            if (lineItem.Quantity < 1)
            {
                lineItem.Quantity = 1;
            }

            string messages = string.Empty;
            ICart  cart     = LoadOrCreateCart(DefaultCartName);
            var    result   = AddToCart(cart, code, lineItem.Quantity, out messages);

            // Populate with additional fields before saving
            ILineItem addedLineItem = cart.GetAllLineItems().FirstOrDefault(x => x.Code == code);

            if (addedLineItem != null)
            {
                // Need content for easier access to more information
                ContentReference itemLink     = _referenceConverter.GetContentLink(code);
                EntryContentBase entryContent = _contentLoader.Get <EntryContentBase>(itemLink);

                AddPropertiesToLineItem(addedLineItem, lineItem, entryContent);

                AddCustomProperties(lineItem, addedLineItem);
            }

            _orderRepository.Save(cart);

            // TODO: Always returns success, if we get warnings, we need to show them
            return(new CartActionResult {
                Success = true, Message = messages
            });
        }
示例#17
0
        /// <summary>
        /// Maps a <see cref="ILineItem"/> to a <see cref="BasketLineItem"/>.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <param name="umbraco">
        /// The <see cref="UmbracoHelper"/>
        /// </param>
        /// <returns>
        /// The <see cref="BasketLineItem"/>.
        /// </returns>
        internal static BasketLineItem ToBasketLineItem(this ILineItem lineItem, UmbracoHelper umbraco)
        {
            var contentId = lineItem.ExtendedData.GetValueAsInt("umbracoContentId");

            IPublishedContent content = null;

            if (contentId > 0)
            {
                content = umbraco.TypedContent(contentId);
            }

            return(new BasketLineItem()
            {
                Key = lineItem.Key,
                ContentId = contentId,
                Thumbnail = content != null?content.GetSafeImage(umbraco, "images") : null,
                                Name = content != null ? content.Name : string.Empty,
                                VariantName = lineItem.Name,
                                Sku = lineItem.Sku,
                                UnitPrice = lineItem.Price,
                                TotalPrice = lineItem.TotalPrice,
                                Quantity = lineItem.Quantity,
                                Url = content != null ? content.Url : string.Empty,
                                IsVariant = lineItem.ExtendedData.GetValueAsBool("isVariant")
            });
        }
        public void Visit(ILineItem lineItem)
        {
            if (!lineItem.ExtendedData.DefinesProductVariant()) return;

            // adjust the total weight
            TotalWeight += lineItem.ExtendedData.GetWeightValue() * lineItem.Quantity;


            TotalLength += lineItem.ExtendedData.GetLengthValue() * lineItem.Quantity;
            TotalWidth += lineItem.ExtendedData.GetWidthValue() * lineItem.Quantity;
            TotalHeight += lineItem.ExtendedData.GetHeightValue()*lineItem.Quantity;

            // adjust the total price
            if (UseOnSalePriceIfOnSale)
            {
                TotalPrice += lineItem.ExtendedData.GetOnSaleValue()
                    ? lineItem.ExtendedData.GetSalePriceValue()
                    : lineItem.ExtendedData.GetPriceValue();
            }
            else
            {
                TotalPrice += lineItem.ExtendedData.GetPriceValue() * lineItem.Quantity;
            }

            Quantity = lineItem.Quantity;
        }
示例#19
0
        /// <summary>
        /// Converts a line item of one type to a line item of another type
        /// </summary>
        /// <typeparam name="T">The specific type of <see cref="ILineItem"/></typeparam>
        /// <param name="lineItem">The line item</param>
        /// <returns>A <see cref="LineItemBase"/> of type T</returns>
        public static T AsLineItemOf <T>(this ILineItem lineItem) where T : class, ILineItem
        {
            var ctrValues = new object[]
            {
                lineItem.LineItemTfKey,
                lineItem.Name,
                lineItem.Sku,
                lineItem.Quantity,
                lineItem.Price,
                lineItem.ExtendedData
            };


            var attempt = ActivatorHelper.CreateInstance <LineItemBase>(typeof(T), ctrValues);

            if (!attempt.Success)
            {
                LogHelper.Error <ILineItem>("Failed to convertion ILineItem", attempt.Exception);
                throw attempt.Exception;
            }

            attempt.Result.Exported = lineItem.Exported;

            return(attempt.Result as T);
        }
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product || !lineItem.AllowsValidation()) return;

            if (!lineItem.ExtendedData.DefinesProductVariant()) return;

            var item = _merchello.Query.Product.GetProductVariantByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (item.OnSale != lineItem.ExtendedData.GetOnSaleValue())
            {
                _invalidPrices.Add(lineItem, item);
                return;
            }

            if ((item.OnSale && (item.SalePrice != lineItem.Price)) || (!item.OnSale && (item.Price != lineItem.Price)))
            {
                _invalidPrices.Add(lineItem, item);
                return;
            }

            // Check if there have been any changes to the product through the service
            if (lineItem.ExtendedData.GetVersionKey() == item.VersionKey) return;

            // on sale
            if (item.OnSale != lineItem.ExtendedData.GetOnSaleValue())
            {
                _invalidPrices.Add(lineItem, item);
            }
        }
示例#21
0
        private static bool TryGetTaxCategoryId(ILineItem item, out int taxCategoryId)
        {
            var reference = _referenceConverter.Service.GetContentLink(item.Code);

            if (ContentReference.IsNullOrEmpty(reference))
            {
                taxCategoryId = 0;

                return(false);
            }

            var entry          = _contentRepository.Service.Get <EntryContentBase>(reference);
            var pricingContent = entry as IPricing;

            if (pricingContent == null || !pricingContent.TaxCategoryId.HasValue)
            {
                taxCategoryId = 0;

                return(false);
            }

            taxCategoryId = pricingContent.TaxCategoryId.Value;

            return(true);
        }
示例#22
0
        private static void AdjustPriceAndTaxes(Currency currency, ILineItem lineItem,
            DinteroOrderLine dinteroItem, IOrderAddress orderAddress)
        {
            var amount = lineItem.GetExtendedPrice(currency).Amount;
            double vat = 0;

            var entryDto = CatalogContext.Current.GetCatalogEntryDto(lineItem.Code,
                new CatalogEntryResponseGroup(CatalogEntryResponseGroup.ResponseGroup.CatalogEntryFull));
            if (entryDto.CatalogEntry.Count > 0)
            {
                CatalogEntryDto.VariationRow[] variationRows = entryDto.CatalogEntry[0].GetVariationRows();
                if (variationRows.Length > 0)
                {
                    var taxCategory = CatalogTaxManager.GetTaxCategoryNameById(variationRows[0].TaxCategoryId);
                    var taxes = OrderContext.Current.GetTaxes(Guid.Empty, taxCategory,
                        Thread.CurrentThread.CurrentCulture.Name, orderAddress).ToList();

                    foreach (var tax in taxes)
                    {
                        if (tax.TaxType == TaxType.SalesTax)
                        {
                            vat = tax.Percentage;
                        }
                    }
                }
            }

            dinteroItem.Amount = CurrencyHelper.CurrencyToInt(amount, currency.CurrencyCode);
            dinteroItem.Vat = Convert.ToInt32(vat);
            dinteroItem.VatAmount = GetVatAmount(amount, vat, currency.CurrencyCode);
        }
示例#23
0
        /// <summary>
        /// Adds a <see cref="ILineItem"/> to the collection of items
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <remarks>
        /// Intended for custom line item types
        /// http://issues.merchello.com/youtrack/issue/M-381
        /// </remarks>
        public void AddItem(ILineItem lineItem)
        {
            Mandate.ParameterNotNullOrEmpty(lineItem.Sku, "The line item must have a sku");
            Mandate.ParameterNotNullOrEmpty(lineItem.Name, "The line item must have a name");

            if (lineItem.Quantity <= 0)
            {
                lineItem.Quantity = 1;
            }
            if (lineItem.Price < 0)
            {
                lineItem.Price = 0;
            }

            if (lineItem.LineItemType == LineItemType.Custom)
            {
                if (!new LineItemTypeField().CustomTypeFields.Select(x => x.TypeKey).Contains(lineItem.LineItemTfKey))
                {
                    var argError = new ArgumentException("The LineItemTfKey was not found in merchello.config custom type fields");
                    LogHelper.Error <SalePreparationBase>("The LineItemTfKey was not found in merchello.config custom type fields", argError);

                    throw argError;
                }
            }

            _itemCache.AddItem(lineItem);
        }
        /// <summary>
        /// Visits the line item
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            // if the line item does not have a product variant reference this vistor cannot check it
            if (!lineItem.ExtendedData.ContainsProductVariantKey())
            {
                return;
            }

            // if the variants inventory is not tracked or if out of stock purchases are allowed check is not necessary
            if (!lineItem.ExtendedData.GetTrackInventoryValue() || lineItem.ExtendedData.GetOutOfStockPurchaseValue())
            {
                return;
            }

            var variant = _productVariantService.GetByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (variant == null)
            {
                return;
            }

            if (variant.TotalInventoryCount < lineItem.Quantity)
            {
                this._failedInventoryValidation.Add(new InventoryValidation(lineItem, variant.TotalInventoryCount));
            }
        }
        public static string GetFullUrl(this ILineItem lineItem)
        {
            var rightUrl = lineItem.GetUrl();
            var baseUrl  = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

            return(new Uri(new Uri(baseUrl), rightUrl).ToString());
        }
示例#26
0
        private TotalItem CreateTotalItem(ILineItem item, ICart cart)
        {
            var lineItemPrices = item.GetLineItemPrices(cart.Currency);

            //TODO: Implement taxes if they are needed per item. For taxes to work, order needs to have shipping adress set as the address is needed by epi to calculate tax.
            var totalItem = new TotalItem
            {
                ItemId                   = item.LineItemId,
                Price                    = item.PlacedPrice,
                BasePrice                = item.PlacedPrice,
                Qty                      = item.Quantity,
                RowTotal                 = item.Quantity * item.PlacedPrice,
                BaseRowTotal             = item.Quantity * item.PlacedPrice,
                RowTotalWithDiscount     = lineItemPrices.DiscountedPrice.Amount,
                TaxAmount                = 0,
                BaseTaxAmount            = 0,
                TaxPercent               = 0,
                DiscountAmount           = item.GetDiscountTotal(cart.Currency).Amount,
                BaseDiscountAmount       = item.GetDiscountTotal(cart.Currency).Amount,
                DiscountPercent          = 0,
                PriceIncludingTax        = 0,
                BasePriceIncludingTax    = 0,
                RowTotalIncludingTax     = item.Quantity * item.PlacedPrice,
                BaseRowTotalIncludingTax = item.Quantity * item.PlacedPrice,
                Options                  = "",
                WeeeTaxAppliedAmount     = null,
                WeeeTaxApplied           = null,
                Name                     = item.DisplayName,
                ProductOption            = new ProductOption()
            };

            return(totalItem);
        }
        /// <summary>
        /// Builds a <see cref="BasketLineItem"/>
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <returns>
        /// The <see cref="BasketLineItem"/>.
        /// </returns>
        public BasketLineItem Build(ILineItem lineItem)
        {
            var contentId = lineItem.ExtendedData.ContainsKey("umbracoContentId")
                                ? int.Parse(lineItem.ExtendedData["umbracoContentId"])
                                : 0;

            var basketLineItem = new BasketLineItem
                {
                    Key = lineItem.Key,
                    ContentId = contentId,
                    Name = lineItem.Name,
                    Sku = lineItem.Sku,
                    UnitPrice = lineItem.Price,
                    TotalPrice = lineItem.TotalPrice,
                    Quantity = lineItem.Quantity,
                    Product = contentId > 0 ? new ProductModel(this._umbraco.TypedContent(contentId))
                                                  {
                                                      CurrentCustomer = this._currentCustomer,
                                                      Currency = this._currency
                                                  }
                                                  : null
                };

            return basketLineItem;
        }
示例#28
0
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product || !lineItem.AllowsValidation())
            {
                return;
            }

            if (!lineItem.ExtendedData.DefinesProductVariant())
            {
                return;
            }

            var item = _merchello.Query.Product.GetProductVariantByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (!item.TrackInventory || item.OutOfStockPurchase)
            {
                return;
            }

            if (item.TotalInventoryCount > 0)
            {
                return;
            }

            _outOfStockItems.Add(lineItem);
        }
示例#29
0
        public override bool UpdatePlacedPrice(ILineItem lineItem, CustomerContact customerContact, MarketId marketId,
                                               Currency currency, Action <ILineItem, ValidationIssue> onValidationError)
        {
            var entryContent = lineItem.GetEntryContent(_referenceConverter, _contentLoader);

            if (entryContent == null)
            {
                onValidationError(lineItem, ValidationIssue.RemovedDueToUnavailableItem);
                return(false);
            }

            if (lineItem.Properties[Constant.Quote.PreQuotePrice] != null &&
                !string.IsNullOrEmpty(lineItem.Properties[Constant.Quote.PreQuotePrice].ToString()))
            {
                return(true);
            }

            var placedPrice = GetPlacedPrice(entryContent, lineItem.Quantity, customerContact, marketId, currency);

            if (placedPrice.HasValue)
            {
                if (new Money(currency.Round(lineItem.PlacedPrice), currency) == placedPrice.Value)
                {
                    return(true);
                }

                onValidationError(lineItem, ValidationIssue.PlacedPricedChanged);
                lineItem.PlacedPrice = placedPrice.Value.Amount;
                return(true);
            }

            onValidationError(lineItem, ValidationIssue.RemovedDueToInvalidPrice);
            return(false);
        }
示例#30
0
 /// <summary>
 /// The visit.
 /// </summary>
 /// <param name="lineItem">
 /// The line item.
 /// </param>
 public void Visit(ILineItem lineItem)
 {
     // For the first release we are going to assume everything shippable is a product listed in the Merchello catalog
     if (lineItem.ExtendedData.ContainsProductVariantKey() && lineItem.ExtendedData.GetShippableValue() && lineItem.LineItemType == LineItemType.Product)
     {                
         _lineItems.Add(lineItem.AsLineItemOf<OrderLineItem>());
     }
 }
示例#31
0
        /// <summary>
        /// Gets display name with current language.
        /// </summary>
        /// <param name="lineItem">The line item of order.</param>
        /// <param name="maxSize">The number of character to get display name.</param>
        /// <returns>Display name with current language.</returns>
        public static string GetDisplayNameOfCurrentLanguage(ILineItem lineItem, int maxSize)
        {
            // if the entry is null (product is deleted), return item display name
            var entryContent = _catalogContentLoader.Service.Get <EntryContentBase>(_referenceConverter.Service.GetContentLink(lineItem.Code));
            var displayName  = entryContent != null ? entryContent.DisplayName : lineItem.DisplayName;

            return(StripPreviewText(displayName, maxSize <= 0 ? 100 : maxSize));
        }
示例#32
0
 public void Visit(ILineItem lineItem)
 {
     if (lineItem.ExtendedData.GetTaxableValue())
     {
         lineItem.ExtendedData.SetValue(Constants.ExtendedDataKeys.LineItemTaxAmount, (lineItem.TotalPrice * _taxRate).ToString(CultureInfo.InvariantCulture));
         _lineItems.Add(lineItem);
     }
 }
 /// <summary>
 /// The visit.
 /// </summary>
 /// <param name="lineItem">
 /// The line item.
 /// </param>
 public void Visit(ILineItem lineItem)
 {
     // For the first release we are going to assume everything shippable is a product listed in the Merchello catalog
     if (lineItem.ExtendedData.ContainsProductVariantKey() && lineItem.ExtendedData.GetShippableValue() && lineItem.LineItemType == LineItemType.Product)
     {
         _lineItems.Add(lineItem.AsLineItemOf <OrderLineItem>());
     }
 }
示例#34
0
 public void Visit(ILineItem lineItem)
 {
     if (lineItem.ExtendedData.GetTaxableValue())
     {
         lineItem.ExtendedData.SetValue(Constants.ExtendedDataKeys.LineItemTaxAmount, (lineItem.TotalPrice * _taxRate).ToString(CultureInfo.InvariantCulture));
         _lineItems.Add(lineItem);
     }
 }
示例#35
0
        /// <summary>
        /// Get display name with current language
        /// </summary>
        /// <param name="item">The line item of oder</param>
        /// <param name="maxSize">The number of character to get display name</param>
        /// <returns>Display name with current language</returns>
        public static string GetDisplayNameOfCurrentLanguage(this ILineItem item, int maxSize)
        {
            Entry entry = CatalogContext.Current.GetCatalogEntry(item.Code, new CatalogEntryResponseGroup(CatalogEntryResponseGroup.ResponseGroup.CatalogEntryFull));
            // if the entry is null (product is deleted), return item display name
            var displayName = (entry != null) ? StoreHelper.GetEntryDisplayName(entry).StripPreviewText(maxSize <= 0 ? 100 : maxSize) : item.DisplayName.StripPreviewText(maxSize <= 0 ? 100 : maxSize);

            return(displayName);
        }
示例#36
0
 private Money?GetDiscountedPrice(ICart cart, ILineItem lineItem)
 {
     if (cart.Name.Equals(_cartService.DefaultWishListName))
     {
         return(_pricingService.GetDiscountPrice(lineItem.Code)?.UnitPrice);
     }
     return(_pricingService.GetDiscountedPrice(lineItem, cart.Currency));
 }
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product || !lineItem.ExtendedData.TaxIncludedInProductPrice()) return;

            lineItem.Price = lineItem.ExtendedData.GetOnSaleValue() ?
                lineItem.ExtendedData.ProductPreTaxSalePrice() :
                lineItem.ExtendedData.ProductPreTaxPrice();
        }
示例#38
0
 private void Parse(ILineItem lineitem, ConcurrentBag <ILineItem> wordsLocations)
 {
     string[] words = lineitem.TextLine.Split(separators, StringSplitOptions.RemoveEmptyEntries);
     foreach (var item in words)
     {
         wordsLocations.Add(new LineItem(text: item, number: lineitem.Number));
     }
 }
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product || !lineItem.AllowsValidation()) return;

            if (!lineItem.ExtendedData.DefinesProductVariant()) return;

            var variant = _merchello.Query.Product.GetProductVariantByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (variant == null) _noLongerExists.Add(lineItem);
        }
 /// <summary>
 /// Visits the line item an asserts the maximum quantity.
 /// </summary>
 /// <param name="lineItem">
 /// The line item.
 /// </param>
 public void Visit(ILineItem lineItem)
 {
     if (lineItem.LineItemType == LineItemType.Product)
     {
         if (lineItem.Quantity > _maximum) lineItem.Quantity = _maximum;
         ModifiedItems.Add(lineItem);
     }
     else
     {
         ModifiedItems.Add(lineItem);
     }
 }
示例#41
0
        public static void AddValidationIssues(this Dictionary<ILineItem, List<ValidationIssue>> issues, ILineItem lineItem, ValidationIssue issue)
        {
            if (!issues.ContainsKey(lineItem))
            {
                issues.Add(lineItem, new List<ValidationIssue>());
            }

            if (!issues[lineItem].Contains(issue))
            {
                issues[lineItem].Add(issue);
            }
        }
        /// <summary>
        /// The visit.
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            if (lineItem.LineItemType != LineItemType.Product || !lineItem.AllowsValidation()) return;

            if (!lineItem.ExtendedData.DefinesProductVariant()) return;

            var item = _merchello.Query.Product.GetProductVariantByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (!item.TrackInventory || item.OutOfStockPurchase) return;

            if (item.TotalInventoryCount > 0) return;

            _outOfStockItems.Add(lineItem);
        }
 /// <summary>
 /// Visits the line items to apply expression.
 /// </summary>
 /// <param name="lineItem">
 /// The line item.
 /// </param>        
 public void Visit(ILineItem lineItem)
 {
     if (lineItem.LineItemType == LineItemType.Product)
     {
         if (StringOperatorHelper.Evaluate(
             _property == "price" ? lineItem.TotalPrice : lineItem.Quantity,
             _target,
             this._operator)) FilteredLineItems.Add(lineItem);
     }
     else
     {
         FilteredLineItems.Add(lineItem);
     }
 }
示例#44
0
 /// <summary>
 /// The visit.
 /// </summary>
 /// <param name="lineItem">
 /// The line item.
 /// </param>
 public void Visit(ILineItem lineItem)
 {
     if (!lineItem.ExtendedData.GetTaxableValue()) return;
     if (lineItem.LineItemType == LineItemType.Discount)
     {
         lineItem.ExtendedData.SetValue(Constants.ExtendedDataKeys.LineItemTaxAmount, (-lineItem.TotalPrice * this._taxRate).ToString(CultureInfo.InvariantCulture));
     }
     else
     {
         lineItem.ExtendedData.SetValue(Constants.ExtendedDataKeys.LineItemTaxAmount, (lineItem.TotalPrice * this._taxRate).ToString(CultureInfo.InvariantCulture));
     }
     lineItem.ExtendedData.SetValue(Constants.ExtendedDataKeys.BaseTaxRate, this._taxRate.ToString());
     _lineItems.Add(lineItem);
 }
        public void Visit(ILineItem lineItem)
        {
            if (!lineItem.ExtendedData.ContainsWarehouseCatalogKey()) return;

            var key = lineItem.ExtendedData.GetWarehouseCatalogKey();

            if (_catalogValidationStatus == CatalogValidationStatus.ErrorNoCatalogFound)
            {
                _catalogValidationStatus = CatalogValidationStatus.Ok;
                _warehouseCatalogKey = key;
            }
            else if (_catalogValidationStatus == CatalogValidationStatus.Ok && !_warehouseCatalogKey.Equals(key))
            {
                _catalogValidationStatus = CatalogValidationStatus.ErrorMultipleCatalogs;
            }
        }
        public void Visit(ILineItem lineItem)
        {
            if (!lineItem.ExtendedData.DefinesProductVariant()) return;

            // adjust the total price
            if (UseOnSalePriceIfOnSale)
            {
                TotalPrice += lineItem.ExtendedData.GetOnSaleValue()
                    ? lineItem.ExtendedData.GetSalePriceValue()
                    : lineItem.ExtendedData.GetPriceValue();
            }
            else
            {
                TotalPrice += lineItem.ExtendedData.GetPriceValue() * lineItem.Quantity;
            }
        }
示例#47
0
        protected void Page_Load( object sender, EventArgs e )
        {
            this.otrans = WebGlobals.Provider.GetOnlineRecord( this.Id );
            this.account = WebGlobals.Provider.GetAccountBySource( this.otrans.OnlineSource );

            this.lblDate.Text = string.Format( "{0:M/d/yyyy}", this.otrans.Date );
            this.lblAmount.Text = string.Format( "{0:N2}", this.otrans.Amount );
            this.lblDescription.Text = this.otrans.Description;

            DataHelper helper = new DataHelper( WebGlobals.Provider );
            this.bestItem = helper.GetBestMatchingLineItem( this.account, this.otrans );

            this.items.AddRange( WebGlobals.Provider.GetPotentialMatchingLineItems( this.account, this.otrans ) );

            this.records = WebGlobals.Provider.GetRecordsByDescription( this.otrans.OnlineSource, this.otrans.Description );
        }
示例#48
0
 public static bool HasItemBeenRemoved(this Dictionary<ILineItem, List<ValidationIssue>> issuesPerLineItem, ILineItem lineItem)
 {
     List<ValidationIssue> issues;
     if (issuesPerLineItem.TryGetValue(lineItem, out issues))
     {
         return issues.Any(x => x == ValidationIssue.RemovedDueToInactiveWarehouse ||
                 x == ValidationIssue.RemovedDueToCodeMissing ||
                 x == ValidationIssue.RemovedDueToInsufficientQuantityInInventory ||
                 x == ValidationIssue.RemovedDueToInvalidPrice ||
                 x == ValidationIssue.RemovedDueToMissingInventoryInformation ||
                 x == ValidationIssue.RemovedDueToNotAvailableInMarket ||
                 x == ValidationIssue.RemovedDueToUnavailableCatalog ||
                 x == ValidationIssue.RemovedDueToUnavailableItem);
     }
     return false;
 }
        /// <summary>
        /// Visits the line item
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        public void Visit(ILineItem lineItem)
        {
            // if the line item does not have a product variant reference this vistor cannot check it
            if (!lineItem.ExtendedData.ContainsProductVariantKey()) return;

            // if the variants inventory is not tracked or if out of stock purchases are allowed check is not necessary
            if (!lineItem.ExtendedData.GetTrackInventoryValue() || lineItem.ExtendedData.GetOutOfStockPurchaseValue()) return;

            var variant = _productVariantService.GetByKey(lineItem.ExtendedData.GetProductVariantKey());

            if (variant == null) return;

            if (variant.TotalInventoryCount < lineItem.Quantity)
            {
                this._failedInventoryValidation.Add(new InventoryValidation(lineItem, variant.TotalInventoryCount));
            }
        }
        /// <summary>
        /// Adds a <see cref="ILineItem"/> to the collection of items
        /// </summary>
        /// <param name="lineItem">
        /// The line item.
        /// </param>
        /// <remarks>
        /// Intended for custom line item types
        /// http://issues.merchello.com/youtrack/issue/M-381
        /// </remarks>
        public virtual void AddItem(ILineItem lineItem)
        {
            Mandate.ParameterNotNullOrEmpty(lineItem.Sku, "The line item must have a sku");
            Mandate.ParameterNotNullOrEmpty(lineItem.Name, "The line item must have a name");

            if (lineItem.Quantity <= 0) lineItem.Quantity = 1;
            if (lineItem.Price < 0) lineItem.Price = 0;

            if (lineItem.LineItemType == LineItemType.Custom)
            {
                if (!new LineItemTypeField().CustomTypeFields.Select(x => x.TypeKey).Contains(lineItem.LineItemTfKey))
                {
                    var argError = new ArgumentException("The LineItemTfKey was not found in merchello.config custom type fields");
                    LogHelper.Error<SalePreparationBase>("The LineItemTfKey was not found in merchello.config custom type fields", argError);

                    throw argError;
                }
            }

            Context.ItemCache.AddItem(lineItem);
        }
        public virtual CartItemViewModel CreateCartItemViewModel(ICart cart, ILineItem lineItem, VariationContent variant)
        {
            var productLink = variant.GetParentProducts(_relationRepository).FirstOrDefault();
            var product = _contentLoader.Get<ProductContent>(productLink) as FashionProduct;

            return new CartItemViewModel
            {
                Code = lineItem.Code,
                DisplayName = variant.DisplayName,
                ImageUrl = variant.GetAssets<IContentImage>(_contentLoader, _urlResolver).FirstOrDefault() ?? "",
                DiscountedPrice = GetDiscountedPrice(cart, lineItem),
                PlacedPrice = new Money(lineItem.PlacedPrice, _currencyService.GetCurrentCurrency()),
                Quantity = lineItem.Quantity,
                Url = lineItem.GetUrl(),
                Variant = variant,
                IsAvailable = _pricingService.GetCurrentPrice(variant.Code).HasValue,
                Brand = GetBrand(product),
                AvailableSizes = GetAvailableSizes(product, variant),
                DiscountedUnitPrice = GetDiscountedUnitPrice(cart, lineItem),
                IsGift = lineItem.IsGift
            };
        }
示例#52
0
 public override void SetLineItem( ILineItem item )
 {
     base.SetLineItem( item );
 }
        /// <summary>
        /// The build product payment details item type.
        /// </summary>
        /// <param name="item">
        /// The item.
        /// </param>        
        /// <param name="factory">
        /// The <see cref="PayPalBasicAmountTypeFactory"/>.
        /// </param>
        /// <returns>
        /// The <see cref="PaymentDetailsItemType"/>.
        /// </returns>
        protected virtual PaymentDetailsItemType BuildProductPaymentDetailsItemType(ILineItem item, PayPalBasicAmountTypeFactory factory)
        {
            IProductContent product = null;
            if (_settings.UsesProductContent)
            {
                var productKey = item.ExtendedData.GetProductKey();
                product = _merchello.TypedProductContent(productKey);
            }

            var detailsItemType = new PaymentDetailsItemType
            {
                Name = item.Name,
                ItemURL = product != null ?
                    string.Format("{0}{1}", _settings.WebsiteUrl, product.Url) :
                    null,
                Amount = factory.Build(item.Price),
                Quantity = item.Quantity
            };

            return detailsItemType;
        }
        /// <summary>
        /// Builds a <see cref="PaymentDetailsItemType"/>.
        /// </summary>
        /// <param name="item">
        /// The item.
        /// </param>
        /// <param name="factory">
        /// The <see cref="PayPalBasicAmountTypeFactory"/>.
        /// </param>
        /// <param name="isDiscount">
        /// The is discount.
        /// </param>
        /// <returns>
        /// The <see cref="PaymentDetailsItemType"/>.
        /// </returns>
        protected virtual PaymentDetailsItemType BuildGenericPaymentDetailsItemType(ILineItem item, PayPalBasicAmountTypeFactory factory, bool isDiscount)
        {
            var detailsItemType = new PaymentDetailsItemType
            {
                Name = item.Name,
                ItemURL = null,
                Amount = factory.Build(item.Price),
                Quantity = item.Quantity,
            };

            return detailsItemType;
        }
示例#55
0
 public LineItemContainer( ILineItem lineItem )
 {
     this.LineItem = lineItem;
 }
 public LineItemTaxDecorator(ILineItem lineItem, ITax lineTax)
 {
     this._decoratedLineItem = lineItem;
     this._lineTax = lineTax;
 }
 /// <summary>
 /// Removes a line item for the collection of items
 /// </summary>
 /// <param name="lineItem">
 /// The line item to be removed
 /// </param>
 public virtual void RemoveItem(ILineItem lineItem)
 {
     Context.ItemCache.Items.Remove(lineItem.Sku);
 }
示例#58
0
 public void AddItem(ILineItem item)
 {
     this._items.Add(item);
 }
示例#59
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RedeemCouponEventArgs"/> class.
 /// </summary>
 /// <param name="container">
 /// The line item container (usually the <see cref="IInvoice"/>).
 /// </param>
 /// <param name="lineItem">
 /// The line item.
 /// </param>
 public RedeemCouponEventArgs(ILineItemContainer container, ILineItem lineItem)
 {
     LineItem = lineItem;
     Container = container;
 }
示例#60
0
 public void Visit(ILineItem lineItem)
 {
     _visited.Add(lineItem);
 }