/// <summary> /// Place the order with data collected in the provided <see cref="Atomia.Store.Core.OrderContext"/>. /// </summary> /// <param name="orderContext">Context with cart, contact and other relevant data.</param> /// <returns>The results of placing the order</returns> public OrderResult PlaceOrder(OrderContext orderContext) { var publicOrderContext = new PublicOrderContext(orderContext); // Add some extra data that might be needed by order handlers. foreach (var cartItem in orderContext.Cart.CartItems) { var product = productProvider.GetProduct(cartItem.ArticleNumber); var renewalPeriodId = renewalPeriodProvider.GetRenewalPeriodId(cartItem); publicOrderContext.AddItemData(new ItemData(cartItem, product, renewalPeriodId)); } var paymentHandler = paymentDataHandlers.FirstOrDefault(h => h.Id == orderContext.PaymentData.Id); if (paymentHandler == null) { throw new InvalidOperationException(String.Format("Payment data handler is not available for {0}.", orderContext.PaymentData.Id)); } var createdOrder = orderCreator.CreateOrder(publicOrderContext, paymentHandler); var redirectUrl = urlProvider.SuccessUrl; if (paymentHandler.PaymentMethodType == PaymentMethodEnum.PayByCard && createdOrder.Total > Decimal.Zero) { redirectUrl = paymentTransactionCreator.CreatePaymentTransaction(publicOrderContext, createdOrder, paymentHandler); } return(new OrderResult { RedirectUrl = redirectUrl }); }
/// <inheritdoc /> public Cart CalculatePricing(Cart cart) { var publicOrder = CreateBasicOrder(); var publicOrderItems = new List <PublicOrderItem>(); var itemNo = 0; foreach (var cartItem in cart.CartItems) { var renewalPeriodId = renewalPeriodProvider.GetRenewalPeriodId(cartItem); publicOrderItems.Add(new PublicOrderItem { ItemNumber = cartItem.ArticleNumber, RenewalPeriodId = renewalPeriodId, Quantity = cartItem.Quantity, ItemNo = itemNo++ }); } publicOrder.OrderItems = publicOrderItems.ToArray(); var publicOrderCustomData = new List <PublicOrderCustomData>(); if (!string.IsNullOrEmpty(cart.CampaignCode)) { publicOrderCustomData.Add(new PublicOrderCustomData { Name = "CampaignCode", Value = cart.CampaignCode }); } if (cart.CustomAttributes != null) { foreach (Core.CustomAttribute attr in cart.CustomAttributes) { publicOrderCustomData.Add(new PublicOrderCustomData { Name = attr.Name, Value = attr.Value }); } } publicOrder.CustomData = publicOrderCustomData.ToArray(); var calculatedPublicOrder = BillingApi.CalculateOrder(publicOrder); IEnumerable <Tax> taxes = new List <Tax>(); if (calculatedPublicOrder.Taxes != null && calculatedPublicOrder.Taxes.Count() > 0) { taxes = calculatedPublicOrder.Taxes.Select(t => new Tax(t.Name, t.Total, t.Percent)); } var subtotal = this.pricesIncludeVat ? calculatedPublicOrder.Total : calculatedPublicOrder.Subtotal; cart.SetPricing(subtotal, calculatedPublicOrder.Total, taxes); var priceCalculator = new PriceCalculator(this.pricesIncludeVat, this.inclusiveTaxCalculationType); foreach (var cartItem in cart.CartItems) { PublicOrderItem calculatedItem; var calcOrderItems = calculatedPublicOrder.OrderItems; if (cartItem.RenewalPeriod == null) { calculatedItem = calcOrderItems.First(x => x.ItemNumber == cartItem.ArticleNumber && x.RenewalPeriod == 0); } else { calculatedItem = calcOrderItems.First(x => x.ItemNumber == cartItem.ArticleNumber && x.RenewalPeriod == cartItem.RenewalPeriod.Period && x.RenewalPeriodUnit.ToUpper() == cartItem.RenewalPeriod.Unit); } IEnumerable <Tax> itemTaxes = new List <Tax>(); if (calculatedItem.Taxes != null && calculatedItem.Taxes.Count() > 0) { itemTaxes = calculatedItem.Taxes.Select(t => new Tax(t.Name, calculatedItem.TaxAmount, t.Percent)); } var price = priceCalculator.CalculatePrice(calculatedItem.Price, calculatedItem.Taxes); var discount = priceCalculator.CalculatePrice(calculatedItem.Discount, calculatedItem.Taxes); cartItem.SetPricing(price, discount, itemTaxes); cartItem.Quantity = calculatedItem.Quantity; } return(cart); }