/// <summary> /// Delete an order item /// </summary> /// <param name="orderItem">The order item</param> public virtual void DeleteOrderItem(OrderItem orderItem) { if (orderItem == null) throw new ArgumentNullException("orderItem"); _orderItemRepository.Delete(orderItem); //event notification _eventPublisher.EntityDeleted(orderItem); }
public void Can_save_and_load_orderItem_with_giftCard() { var orderItem = new OrderItem { Order = GetTestOrder(), Product = GetTestProduct(), }; orderItem.AssociatedGiftCards.Add(GetTestGiftCard()); var fromDb = SaveAndLoadEntity(orderItem); fromDb.ShouldNotBeNull(); fromDb.AssociatedGiftCards.ShouldNotBeNull(); (fromDb.AssociatedGiftCards.Count == 1).ShouldBeTrue(); fromDb.AssociatedGiftCards.First().Amount.ShouldEqual(10); }
public void Can_save_and_load_orderItem() { var orderItem = new OrderItem { Order = GetTestOrder(), Product= GetTestProduct(), Quantity = 1, UnitPriceInclTax= 1.1M, UnitPriceExclTax = 2.1M, PriceInclTax = 3.1M, PriceExclTax = 4.1M, DiscountAmountInclTax = 5.1M, DiscountAmountExclTax = 6.1M, OriginalProductCost = 7.1M, AttributeDescription= "AttributeDescription1", AttributesXml= "AttributesXml1", DownloadCount= 7, IsDownloadActivated=true, LicenseDownloadId= 8, ItemWeight = 9.87M, RentalStartDateUtc = new DateTime(2010, 01, 01), RentalEndDateUtc = new DateTime(2010, 01, 02) }; var fromDb = SaveAndLoadEntity(orderItem); fromDb.ShouldNotBeNull(); fromDb.Order.ShouldNotBeNull(); fromDb.Product.ShouldNotBeNull(); fromDb.UnitPriceInclTax.ShouldEqual(1.1M); fromDb.UnitPriceExclTax.ShouldEqual(2.1M); fromDb.PriceInclTax.ShouldEqual(3.1M); fromDb.PriceExclTax.ShouldEqual(4.1M); fromDb.DiscountAmountInclTax.ShouldEqual(5.1M); fromDb.DiscountAmountExclTax.ShouldEqual(6.1M); fromDb.OriginalProductCost.ShouldEqual(7.1M); fromDb.AttributeDescription.ShouldEqual("AttributeDescription1"); fromDb.AttributesXml.ShouldEqual("AttributesXml1"); fromDb.DownloadCount.ShouldEqual(7); fromDb.IsDownloadActivated.ShouldEqual(true); fromDb.LicenseDownloadId.ShouldEqual(8); fromDb.ItemWeight.ShouldEqual(9.87M); fromDb.RentalStartDateUtc.ShouldEqual(new DateTime(2010, 01, 01)); fromDb.RentalEndDateUtc.ShouldEqual(new DateTime(2010, 01, 02)); fromDb.Order.ShouldNotBeNull(); }
public virtual void AddReturnRequestTokens(IList<Token> tokens, ReturnRequest returnRequest, OrderItem orderItem) { tokens.Add(new Token("ReturnRequest.ID", returnRequest.Id.ToString())); tokens.Add(new Token("ReturnRequest.OrderId", orderItem.OrderId.ToString())); tokens.Add(new Token("ReturnRequest.Product.Quantity", returnRequest.Quantity.ToString())); tokens.Add(new Token("ReturnRequest.Product.Name", orderItem.Product.Name)); tokens.Add(new Token("ReturnRequest.Reason", returnRequest.ReasonForReturn)); tokens.Add(new Token("ReturnRequest.RequestedAction", returnRequest.RequestedAction)); tokens.Add(new Token("ReturnRequest.CustomerComment", HtmlHelper.FormatText(returnRequest.CustomerComments, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.StaffNotes", HtmlHelper.FormatText(returnRequest.StaffNotes, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.Status", returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext))); //event notification _eventPublisher.EntityTokensAdded(returnRequest, tokens); }
public PlaceOrderResult PaypalOrderDetails(ProcessPaymentRequest processPaymentRequest) { //think about moving functionality of processing recurring orders (after the initial order was placed) to ProcessNextRecurringPayment() method if (processPaymentRequest == null) throw new ArgumentNullException("processPaymentRequest"); var result = new PlaceOrderResult(); try { //if (processPaymentRequest.OrderGuid == Guid.Empty) // processPaymentRequest.OrderGuid = Guid.NewGuid(); //prepare order details var details = PreparePlaceOrderDetails(processPaymentRequest); #region Payment workflow //process payment ProcessPaymentResult processPaymentResult = null; //skip payment workflow if order total equals zero var skipPaymentWorkflow = details.OrderTotal == decimal.Zero; if (!skipPaymentWorkflow) { var paymentMethod = _paymentService.LoadPaymentMethodBySystemName(processPaymentRequest.PaymentMethodSystemName); if (paymentMethod == null) throw new NopException("Payment method couldn't be loaded"); //ensure that payment method is active if (!paymentMethod.IsPaymentMethodActive(_paymentSettings)) throw new NopException("Payment method is not active"); if (!processPaymentRequest.IsRecurringPayment) { if (details.IsRecurringShoppingCart) { //recurring cart var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: case RecurringPaymentType.Automatic: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; default: throw new NopException("Not supported recurring payment type"); } } else { //standard cart processPaymentResult = _paymentService.ProcessPayment(processPaymentRequest); } } else { if (details.IsRecurringShoppingCart) { //Old credit card info processPaymentRequest.CreditCardType = details.InitialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(details.InitialOrder.CardType) : ""; processPaymentRequest.CreditCardName = details.InitialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(details.InitialOrder.CardName) : ""; processPaymentRequest.CreditCardNumber = details.InitialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(details.InitialOrder.CardNumber) : ""; processPaymentRequest.CreditCardCvv2 = details.InitialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(details.InitialOrder.CardCvv2) : ""; try { processPaymentRequest.CreditCardExpireMonth = details.InitialOrder.AllowStoringCreditCardNumber ? Convert.ToInt32(_encryptionService.DecryptText(details.InitialOrder.CardExpirationMonth)) : 0; processPaymentRequest.CreditCardExpireYear = details.InitialOrder.AllowStoringCreditCardNumber ? Convert.ToInt32(_encryptionService.DecryptText(details.InitialOrder.CardExpirationYear)) : 0; } catch { } var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; case RecurringPaymentType.Automatic: //payment is processed on payment gateway site processPaymentResult = new ProcessPaymentResult(); break; default: throw new NopException("Not supported recurring payment type"); } } else { throw new NopException("No recurring products"); } } } else { //payment is not required if (processPaymentResult == null) processPaymentResult = new ProcessPaymentResult(); processPaymentResult.NewPaymentStatus = PaymentStatus.Paid; } if (processPaymentResult == null) throw new NopException("processPaymentResult is not available"); #endregion if (processPaymentResult.Success) { #region Save order details var order = new Order { StoreId = processPaymentRequest.StoreId, OrderGuid = processPaymentRequest.OrderGuid, CustomerId = details.Customer.Id, CustomerLanguageId = details.CustomerLanguage.Id, CustomerTaxDisplayType = details.CustomerTaxDisplayType, CustomerIp = _webHelper.GetCurrentIpAddress(), OrderSubtotalInclTax = details.OrderSubTotalInclTax, OrderSubtotalExclTax = details.OrderSubTotalExclTax, OrderSubTotalDiscountInclTax = details.OrderSubTotalDiscountInclTax, OrderSubTotalDiscountExclTax = details.OrderSubTotalDiscountExclTax, OrderShippingInclTax = details.OrderShippingTotalInclTax, OrderShippingExclTax = details.OrderShippingTotalExclTax, PaymentMethodAdditionalFeeInclTax = details.PaymentAdditionalFeeInclTax, PaymentMethodAdditionalFeeExclTax = details.PaymentAdditionalFeeExclTax, TaxRates = details.TaxRates, OrderTax = details.OrderTaxTotal, OrderTotal = details.OrderTotal, RefundedAmount = decimal.Zero, OrderDiscount = details.OrderDiscountAmount, CheckoutAttributeDescription = details.CheckoutAttributeDescription, CheckoutAttributesXml = details.CheckoutAttributesXml, CustomerCurrencyCode = details.CustomerCurrencyCode, CurrencyRate = details.CustomerCurrencyRate, AffiliateId = details.AffiliateId, OrderStatus = OrderStatus.Pending, AllowStoringCreditCardNumber = processPaymentResult.AllowStoringCreditCardNumber, CardType = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardType) : string.Empty, CardName = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardName) : string.Empty, CardNumber = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardNumber) : string.Empty, MaskedCreditCardNumber = _encryptionService.EncryptText(_paymentService.GetMaskedCreditCardNumber(processPaymentRequest.CreditCardNumber)), CardCvv2 = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardCvv2) : string.Empty, CardExpirationMonth = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardExpireMonth.ToString()) : string.Empty, CardExpirationYear = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardExpireYear.ToString()) : string.Empty, PaymentMethodSystemName = processPaymentRequest.PaymentMethodSystemName, AuthorizationTransactionId = processPaymentResult.AuthorizationTransactionId, AuthorizationTransactionCode = processPaymentResult.AuthorizationTransactionCode, AuthorizationTransactionResult = processPaymentResult.AuthorizationTransactionResult, CaptureTransactionId = processPaymentResult.CaptureTransactionId, CaptureTransactionResult = processPaymentResult.CaptureTransactionResult, SubscriptionTransactionId = processPaymentResult.SubscriptionTransactionId, PaymentStatus = processPaymentResult.NewPaymentStatus, PaidDateUtc = null, BillingAddress = details.BillingAddress, ShippingAddress = details.ShippingAddress, ShippingStatus = details.ShippingStatus, ShippingMethod = details.ShippingMethodName, PickUpInStore = details.PickUpInStore, ShippingRateComputationMethodSystemName = details.ShippingRateComputationMethodSystemName, CustomValuesXml = processPaymentRequest.SerializeCustomValues(), VatNumber = details.VatNumber, CreatedOnUtc = DateTime.UtcNow }; //_orderService.InsertOrder(order); result.PlacedOrder = order; if (!processPaymentRequest.IsRecurringPayment) { //move shopping cart items to order items foreach (var sc in details.Cart) { //prices decimal taxRate; Discount scDiscount; decimal discountAmount; decimal scUnitPrice = _priceCalculationService.GetUnitPrice(sc); decimal scSubTotal = _priceCalculationService.GetSubTotal(sc, true, out discountAmount, out scDiscount); decimal scUnitPriceInclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, true, details.Customer, out taxRate); decimal scUnitPriceExclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, false, details.Customer, out taxRate); decimal scSubTotalInclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, true, details.Customer, out taxRate); decimal scSubTotalExclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, false, details.Customer, out taxRate); decimal discountAmountInclTax = _taxService.GetProductPrice(sc.Product, discountAmount, true, details.Customer, out taxRate); decimal discountAmountExclTax = _taxService.GetProductPrice(sc.Product, discountAmount, false, details.Customer, out taxRate); if (scDiscount != null && !details.AppliedDiscounts.ContainsDiscount(scDiscount)) details.AppliedDiscounts.Add(scDiscount); //attributes string attributeDescription = _productAttributeFormatter.FormatAttributes(sc.Product, sc.AttributesXml, details.Customer); var itemWeight = _shippingService.GetShoppingCartItemWeight(sc); //save order item var orderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = sc.ProductId, UnitPriceInclTax = scUnitPriceInclTax, UnitPriceExclTax = scUnitPriceExclTax, PriceInclTax = scSubTotalInclTax, PriceExclTax = scSubTotalExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(sc.Product, sc.AttributesXml), AttributeDescription = attributeDescription, AttributesXml = sc.AttributesXml, Quantity = sc.Quantity, DiscountAmountInclTax = discountAmountInclTax, DiscountAmountExclTax = discountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = itemWeight, RentalStartDateUtc = sc.RentalStartDateUtc, RentalEndDateUtc = sc.RentalEndDateUtc }; order.OrderItems.Add(orderItem); //_orderService.UpdateOrder(order); //gift cards if (sc.Product.IsGiftCard) { string giftCardRecipientName, giftCardRecipientEmail, giftCardSenderName, giftCardSenderEmail, giftCardMessage; _productAttributeParser.GetGiftCardAttribute(sc.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (int i = 0; i < sc.Quantity; i++) { var gc = new GiftCard { GiftCardType = sc.Product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = sc.Product.OverriddenGiftCardAmount.HasValue ? sc.Product.OverriddenGiftCardAmount.Value : scUnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; // _giftCardService.InsertGiftCard(gc); } } //inventory _productService.AdjustInventory(sc.Product, -sc.Quantity, sc.AttributesXml); } //clear shopping cart //details.Cart.ToList().ForEach(sci => _shoppingCartService.DeleteShoppingCartItem(sci, false)); } else { //recurring payment var initialOrderItems = details.InitialOrder.OrderItems; foreach (var orderItem in initialOrderItems) { //save item var newOrderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = orderItem.ProductId, UnitPriceInclTax = orderItem.UnitPriceInclTax, UnitPriceExclTax = orderItem.UnitPriceExclTax, PriceInclTax = orderItem.PriceInclTax, PriceExclTax = orderItem.PriceExclTax, OriginalProductCost = orderItem.OriginalProductCost, AttributeDescription = orderItem.AttributeDescription, AttributesXml = orderItem.AttributesXml, Quantity = orderItem.Quantity, DiscountAmountInclTax = orderItem.DiscountAmountInclTax, DiscountAmountExclTax = orderItem.DiscountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = orderItem.ItemWeight, RentalStartDateUtc = orderItem.RentalStartDateUtc, RentalEndDateUtc = orderItem.RentalEndDateUtc }; order.OrderItems.Add(newOrderItem); //_orderService.UpdateOrder(order); //gift cards if (orderItem.Product.IsGiftCard) { string giftCardRecipientName, giftCardRecipientEmail, giftCardSenderName, giftCardSenderEmail, giftCardMessage; _productAttributeParser.GetGiftCardAttribute(orderItem.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard { GiftCardType = orderItem.Product.GiftCardType, PurchasedWithOrderItem = newOrderItem, Amount = orderItem.UnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; //_giftCardService.InsertGiftCard(gc); } } //inventory _productService.AdjustInventory(orderItem.Product, -orderItem.Quantity, orderItem.AttributesXml); } } //discount usage history if (!processPaymentRequest.IsRecurringPayment) foreach (var discount in details.AppliedDiscounts) { var duh = new DiscountUsageHistory { Discount = discount, Order = order, CreatedOnUtc = DateTime.UtcNow }; //_discountService.InsertDiscountUsageHistory(duh); } //gift card usage history if (!processPaymentRequest.IsRecurringPayment) if (details.AppliedGiftCards != null) foreach (var agc in details.AppliedGiftCards) { decimal amountUsed = agc.AmountCanBeUsed; var gcuh = new GiftCardUsageHistory { GiftCard = agc.GiftCard, UsedWithOrder = order, UsedValue = amountUsed, CreatedOnUtc = DateTime.UtcNow }; agc.GiftCard.GiftCardUsageHistory.Add(gcuh); //_giftCardService.UpdateGiftCard(agc.GiftCard); } //reward points history if (details.RedeemedRewardPointsAmount > decimal.Zero) { _rewardPointService.AddRewardPointsHistoryEntry(details.Customer, -details.RedeemedRewardPoints, order.StoreId, string.Format(_localizationService.GetResource("RewardPoints.Message.RedeemedForOrder", order.CustomerLanguageId), order.Id), order, details.RedeemedRewardPointsAmount); //_customerService.UpdateCustomer(details.Customer); } //recurring orders if (!processPaymentRequest.IsRecurringPayment && details.IsRecurringShoppingCart) { //create recurring payment (the first payment) var rp = new RecurringPayment { CycleLength = processPaymentRequest.RecurringCycleLength, CyclePeriod = processPaymentRequest.RecurringCyclePeriod, TotalCycles = processPaymentRequest.RecurringTotalCycles, StartDateUtc = DateTime.UtcNow, IsActive = true, CreatedOnUtc = DateTime.UtcNow, InitialOrder = order, }; //_orderService.InsertRecurringPayment(rp); var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: { //not supported } break; case RecurringPaymentType.Manual: { //first payment var rph = new RecurringPaymentHistory { RecurringPayment = rp, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }; rp.RecurringPaymentHistory.Add(rph); _orderService.UpdateRecurringPayment(rp); } break; case RecurringPaymentType.Automatic: { //will be created later (process is automated) } break; default: break; } } #endregion #region Notifications & notes //notes, messages if (_workContext.OriginalCustomerIfImpersonated != null) { //this order is placed by a store administrator impersonating a customer order.OrderNotes.Add(new OrderNote { Note = string.Format("Order placed by a store owner ('{0}'. ID = {1}) impersonating the customer.", _workContext.OriginalCustomerIfImpersonated.Email, _workContext.OriginalCustomerIfImpersonated.Id), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); //_orderService.UpdateOrder(order); } else { order.OrderNotes.Add(new OrderNote { Note = "Order placed", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); //_orderService.UpdateOrder(order); } //send email notifications //int orderPlacedStoreOwnerNotificationQueuedEmailId = _workflowMessageService.SendOrderPlacedStoreOwnerNotification(order, _localizationSettings.DefaultAdminLanguageId); //if (orderPlacedStoreOwnerNotificationQueuedEmailId > 0) //{ // order.OrderNotes.Add(new OrderNote // { // Note = string.Format("\"Order placed\" email (to store owner) has been queued. Queued email identifier: {0}.", orderPlacedStoreOwnerNotificationQueuedEmailId), // DisplayToCustomer = false, // CreatedOnUtc = DateTime.UtcNow // }); // //_orderService.UpdateOrder(order); //} var orderPlacedAttachmentFilePath = _orderSettings.AttachPdfInvoiceToOrderPlacedEmail ? _pdfService.PrintOrderToPdf(order, order.CustomerLanguageId) : null; //var orderPlacedAttachmentFileName = _orderSettings.AttachPdfInvoiceToOrderPlacedEmail ? // "order.pdf" : null; //int orderPlacedCustomerNotificationQueuedEmailId = _workflowMessageService // .SendOrderPlacedCustomerNotification(order, order.CustomerLanguageId, orderPlacedAttachmentFilePath, orderPlacedAttachmentFileName); //if (orderPlacedCustomerNotificationQueuedEmailId > 0) //{ // order.OrderNotes.Add(new OrderNote // { // Note = string.Format("\"Order placed\" email (to customer) has been queued. Queued email identifier: {0}.", orderPlacedCustomerNotificationQueuedEmailId), // DisplayToCustomer = false, // CreatedOnUtc = DateTime.UtcNow // }); // //_orderService.UpdateOrder(order); //} //var vendors = GetVendorsInOrder(order); //foreach (var vendor in vendors) //{ // int orderPlacedVendorNotificationQueuedEmailId = _workflowMessageService.SendOrderPlacedVendorNotification(order, vendor, order.CustomerLanguageId); // if (orderPlacedVendorNotificationQueuedEmailId > 0) // { // order.OrderNotes.Add(new OrderNote // { // Note = string.Format("\"Order placed\" email (to vendor) has been queued. Queued email identifier: {0}.", orderPlacedVendorNotificationQueuedEmailId), // DisplayToCustomer = false, // CreatedOnUtc = DateTime.UtcNow // }); // //_orderService.UpdateOrder(order); // } //} //check order status CheckOrderStatus(order); //reset checkout data //if (!processPaymentRequest.IsRecurringPayment) // _customerService.ResetCheckoutData(details.Customer, processPaymentRequest.StoreId, clearCouponCodes: true, clearCheckoutAttributes: true); //if (!processPaymentRequest.IsRecurringPayment) //{ // _customerActivityService.InsertActivity( // "PublicStore.PlaceOrder", // _localizationService.GetResource("ActivityLog.PublicStore.PlaceOrder"), // order.Id); //} //raise event //_eventPublisher.Publish(new OrderPlacedEvent(order)); if (order.PaymentStatus == PaymentStatus.Paid) { ProcessOrderPaid(order); } #endregion } else { //payment errors foreach (var paymentError in processPaymentResult.Errors) result.AddError(string.Format(_localizationService.GetResource("Checkout.PaymentError"), paymentError)); } } catch (Exception exc) { _logger.Error(exc.Message, exc); result.AddError(exc.Message); } #region Process errors string error = ""; for (int i = 0; i < result.Errors.Count; i++) { error += string.Format("Error {0}: {1}", i + 1, result.Errors[i]); if (i != result.Errors.Count - 1) error += ". "; } if (!String.IsNullOrEmpty(error)) { //log it string logError = string.Format("Error while placing order. {0}", error); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); _logger.Error(logError, customer: customer); } #endregion return result; }
/// <summary> /// Gets a value indicating whether license download is allowed /// </summary> /// <param name="orderItem">Order item to check</param> /// <returns>True if license download is allowed; otherwise, false.</returns> public virtual bool IsLicenseDownloadAllowed(OrderItem orderItem) { if (orderItem == null) return false; return IsDownloadAllowed(orderItem) && orderItem.LicenseDownloadId.HasValue && orderItem.LicenseDownloadId > 0; }
/// <summary> /// Gets a value indicating whether download is allowed /// </summary> /// <param name="orderItem">Order item to check</param> /// <returns>True if download is allowed; otherwise, false.</returns> public virtual bool IsDownloadAllowed(OrderItem orderItem) { if (orderItem == null) return false; var order = EngineContext.Current.Resolve<IOrderService>().GetOrderById(orderItem.OrderId); if (order == null || order.Deleted) return false; //order status if (order.OrderStatus == OrderStatus.Cancelled) return false; var product = orderItem.Product; if (product == null || !product.IsDownload) return false; //payment status switch (product.DownloadActivationType) { case DownloadActivationType.WhenOrderIsPaid: { if (order.PaymentStatus == PaymentStatus.Paid && order.PaidDateUtc.HasValue) { //expiration date if (product.DownloadExpirationDays.HasValue) { if (order.PaidDateUtc.Value.AddDays(product.DownloadExpirationDays.Value) > DateTime.UtcNow) { return true; } } else { return true; } } } break; case DownloadActivationType.Manually: { if (orderItem.IsDownloadActivated) { //expiration date if (product.DownloadExpirationDays.HasValue) { if (order.CreatedOnUtc.AddDays(product.DownloadExpirationDays.Value) > DateTime.UtcNow) { return true; } } else { return true; } } } break; default: break; } return false; }
public ActionResult AddProductToOrderDetails(int orderId, int productId, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); //a vendor does not have to this functionality if (_workContext.CurrentVendor != null) return RedirectToAction("Edit", "Order", new { id = orderId }); var order = _orderService.GetOrderById(orderId); var product = _productService.GetProductById(productId); //save order item //basic properties var unitPriceInclTax = decimal.Zero; decimal.TryParse(form["UnitPriceInclTax"], out unitPriceInclTax); var unitPriceExclTax = decimal.Zero; decimal.TryParse(form["UnitPriceExclTax"], out unitPriceExclTax); var quantity = 1; int.TryParse(form["Quantity"], out quantity); var priceInclTax = decimal.Zero; decimal.TryParse(form["SubTotalInclTax"], out priceInclTax); var priceExclTax = decimal.Zero; decimal.TryParse(form["SubTotalExclTax"], out priceExclTax); //attributes //warnings var warnings = new List<string>(); string attributes = ""; #region Product attributes string selectedAttributes = string.Empty; var productVariantAttributes = _productAttributeService.GetProductVariantAttributesByProductId(product.Id); foreach (var attribute in productVariantAttributes) { string controlId = string.Format("product_attribute_{0}_{1}", attribute.ProductAttributeId, attribute.Id); switch (attribute.AttributeControlType) { case AttributeControlType.DropdownList: case AttributeControlType.RadioList: case AttributeControlType.ColorSquares: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { int selectedAttributeId = int.Parse(ctrlAttributes); if (selectedAttributeId > 0) selectedAttributes = _productAttributeParser.AddProductAttribute(selectedAttributes, attribute, selectedAttributeId.ToString()); } } break; case AttributeControlType.Checkboxes: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { foreach (var item in ctrlAttributes.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { int selectedAttributeId = int.Parse(item); if (selectedAttributeId > 0) selectedAttributes = _productAttributeParser.AddProductAttribute(selectedAttributes, attribute, selectedAttributeId.ToString()); } } } break; case AttributeControlType.TextBox: case AttributeControlType.MultilineTextbox: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { string enteredText = ctrlAttributes.Trim(); selectedAttributes = _productAttributeParser.AddProductAttribute(selectedAttributes, attribute, enteredText); } } break; case AttributeControlType.Datepicker: { var day = form[controlId + "_day"]; var month = form[controlId + "_month"]; var year = form[controlId + "_year"]; DateTime? selectedDate = null; try { selectedDate = new DateTime(Int32.Parse(year), Int32.Parse(month), Int32.Parse(day)); } catch { } if (selectedDate.HasValue) { selectedAttributes = _productAttributeParser.AddProductAttribute(selectedAttributes, attribute, selectedDate.Value.ToString("D")); } } break; case AttributeControlType.FileUpload: { var httpPostedFile = this.Request.Files[controlId]; if ((httpPostedFile != null) && (!String.IsNullOrEmpty(httpPostedFile.FileName))) { int fileMaxSize = _catalogSettings.FileUploadMaximumSizeBytes; if (httpPostedFile.ContentLength > fileMaxSize) { warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.MaximumUploadedFileSize"), (int)(fileMaxSize / 1024))); } else { //save an uploaded file var download = new Download() { DownloadGuid = Guid.NewGuid(), UseDownloadUrl = false, DownloadUrl = "", DownloadBinary = httpPostedFile.GetDownloadBits(), ContentType = httpPostedFile.ContentType, Filename = System.IO.Path.GetFileNameWithoutExtension(httpPostedFile.FileName), Extension = System.IO.Path.GetExtension(httpPostedFile.FileName), IsNew = true }; _downloadService.InsertDownload(download); //save attribute selectedAttributes = _productAttributeParser.AddProductAttribute(selectedAttributes, attribute, download.DownloadGuid.ToString()); } } } break; default: break; } } attributes = selectedAttributes; #endregion #region Gift cards string recipientName = ""; string recipientEmail = ""; string senderName = ""; string senderEmail = ""; string giftCardMessage = ""; if (product.IsGiftCard) { foreach (string formKey in form.AllKeys) { if (formKey.Equals("giftcard.RecipientName", StringComparison.InvariantCultureIgnoreCase)) { recipientName = form[formKey]; continue; } if (formKey.Equals("giftcard.RecipientEmail", StringComparison.InvariantCultureIgnoreCase)) { recipientEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderName", StringComparison.InvariantCultureIgnoreCase)) { senderName = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderEmail", StringComparison.InvariantCultureIgnoreCase)) { senderEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.Message", StringComparison.InvariantCultureIgnoreCase)) { giftCardMessage = form[formKey]; continue; } } attributes = _productAttributeParser.AddGiftCardAttribute(attributes, recipientName, recipientEmail, senderName, senderEmail, giftCardMessage); } #endregion //warnings warnings.AddRange(_shoppingCartService.GetShoppingCartItemAttributeWarnings(order.Customer, ShoppingCartType.ShoppingCart, product, attributes)); warnings.AddRange(_shoppingCartService.GetShoppingCartItemGiftCardWarnings(ShoppingCartType.ShoppingCart, product, attributes)); if (warnings.Count == 0) { //no errors //attributes string attributeDescription = _productAttributeFormatter.FormatAttributes(product, attributes, order.Customer); //save item var orderItem = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = product.Id, UnitPriceInclTax = unitPriceInclTax, UnitPriceExclTax = unitPriceExclTax, PriceInclTax = priceInclTax, PriceExclTax = priceExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(product, attributes), AttributeDescription = attributeDescription, AttributesXml = attributes, Quantity = quantity, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0 }; order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //gift cards if (product.IsGiftCard) { for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard() { GiftCardType = product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = unitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = recipientName, RecipientEmail = recipientEmail, SenderName = senderName, SenderEmail = senderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } //redirect to order details page return RedirectToAction("Edit", "Order", new { id = order.Id }); } else { //errors var model = PrepareAddProductToOrderModel(order.Id, product.Id); model.Warnings.AddRange(warnings); return View(model); } }
protected bool HasAccessToOrderItem(OrderItem orderItem) { if (orderItem == null) throw new ArgumentNullException("orderItem"); if (_workContext.CurrentVendor == null) //not a vendor; has access return true; var vendorId = _workContext.CurrentVendor.Id; return orderItem.Product.VendorId == vendorId; }
public ActionResult AddProductToOrderDetails(int orderId, int productId, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); //a vendor does not have access to this functionality if (_workContext.CurrentVendor != null) return RedirectToAction("Edit", "Order", new { id = orderId }); var order = _orderService.GetOrderById(orderId); var product = _productService.GetProductById(productId); //save order item //basic properties decimal unitPriceInclTax; decimal.TryParse(form["UnitPriceInclTax"], out unitPriceInclTax); decimal unitPriceExclTax; decimal.TryParse(form["UnitPriceExclTax"], out unitPriceExclTax); int quantity; int.TryParse(form["Quantity"], out quantity); decimal priceInclTax; decimal.TryParse(form["SubTotalInclTax"], out priceInclTax); decimal priceExclTax; decimal.TryParse(form["SubTotalExclTax"], out priceExclTax); //warnings var warnings = new List<string>(); //attributes var attributesXml = ParseProductAttributes(product, form); #region Gift cards string recipientName = ""; string recipientEmail = ""; string senderName = ""; string senderEmail = ""; string giftCardMessage = ""; if (product.IsGiftCard) { foreach (string formKey in form.AllKeys) { if (formKey.Equals("giftcard.RecipientName", StringComparison.InvariantCultureIgnoreCase)) { recipientName = form[formKey]; continue; } if (formKey.Equals("giftcard.RecipientEmail", StringComparison.InvariantCultureIgnoreCase)) { recipientEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderName", StringComparison.InvariantCultureIgnoreCase)) { senderName = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderEmail", StringComparison.InvariantCultureIgnoreCase)) { senderEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.Message", StringComparison.InvariantCultureIgnoreCase)) { giftCardMessage = form[formKey]; continue; } } attributesXml = _productAttributeParser.AddGiftCardAttribute(attributesXml, recipientName, recipientEmail, senderName, senderEmail, giftCardMessage); } #endregion #region Rental product DateTime? rentalStartDate = null; DateTime? rentalEndDate = null; if (product.IsRental) { ParseRentalDates(form, out rentalStartDate, out rentalEndDate); } #endregion //warnings warnings.AddRange(_shoppingCartService.GetShoppingCartItemAttributeWarnings(order.Customer, ShoppingCartType.ShoppingCart, product, quantity, attributesXml)); warnings.AddRange(_shoppingCartService.GetShoppingCartItemGiftCardWarnings(ShoppingCartType.ShoppingCart, product, attributesXml)); warnings.AddRange(_shoppingCartService.GetRentalProductWarnings(product, rentalStartDate, rentalEndDate)); if (!warnings.Any()) { //no errors //attributes var attributeDescription = _productAttributeFormatter.FormatAttributes(product, attributesXml, order.Customer); //save item var orderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = product.Id, UnitPriceInclTax = unitPriceInclTax, UnitPriceExclTax = unitPriceExclTax, PriceInclTax = priceInclTax, PriceExclTax = priceExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(product, attributesXml), AttributeDescription = attributeDescription, AttributesXml = attributesXml, Quantity = quantity, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, RentalStartDateUtc = rentalStartDate, RentalEndDateUtc = rentalEndDate }; order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //adjust inventory _productService.AdjustInventory(orderItem.Product, -orderItem.Quantity, orderItem.AttributesXml); //update order totals var updateOrderParameters = new UpdateOrderParameters { UpdatedOrder = order, UpdatedOrderItem = orderItem, PriceInclTax = unitPriceInclTax, PriceExclTax = unitPriceExclTax, SubTotalInclTax = priceInclTax, SubTotalExclTax = priceExclTax, Quantity = quantity }; _orderProcessingService.UpdateOrderTotals(updateOrderParameters); //add a note order.OrderNotes.Add(new OrderNote { Note = "A new order item has been added", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); LogEditOrder(order.Id); //gift cards if (product.IsGiftCard) { for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard { GiftCardType = product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = unitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = recipientName, RecipientEmail = recipientEmail, SenderName = senderName, SenderEmail = senderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } //redirect to order details page TempData["nop.admin.order.warnings"] = updateOrderParameters.Warnings; return RedirectToAction("Edit", "Order", new { id = order.Id }); } //errors var model = PrepareAddProductToOrderModel(order.Id, product.Id); model.Warnings.AddRange(warnings); return View(model); }
/// <summary> /// Sends 'New Return Request' message to a store owner /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="orderItem">Order item</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendNewReturnRequestStoreOwnerNotification(ReturnRequest returnRequest, OrderItem orderItem, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var order = EngineContext.Current.Resolve<IOrderService>().GetOrderById(orderItem.OrderId); var store = _storeService.GetStoreById(order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetActiveMessageTemplate("NewReturnRequest.StoreOwnerNotification", store.Id); if (messageTemplate == null) return 0; //email account var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var customer = EngineContext.Current.Resolve<ICustomerService>().GetCustomerById(returnRequest.CustomerId); //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store, emailAccount); _messageTokenProvider.AddCustomerTokens(tokens, customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, orderItem); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var toEmail = emailAccount.Email; var toName = emailAccount.DisplayName; return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public ActionResult AddProductToOrderDetails(int orderId, int productId, FormCollection form) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); //a vendor does not have access to this functionality if (_workContext.CurrentVendor != null) return RedirectToAction("Edit", "Order", new { id = orderId }); var order = _orderService.GetOrderById(orderId); var product = _productService.GetProductById(productId); //save order item //basic properties decimal unitPriceInclTax; decimal.TryParse(form["UnitPriceInclTax"], out unitPriceInclTax); decimal unitPriceExclTax; decimal.TryParse(form["UnitPriceExclTax"], out unitPriceExclTax); int quantity; int.TryParse(form["Quantity"], out quantity); decimal priceInclTax; decimal.TryParse(form["SubTotalInclTax"], out priceInclTax); decimal priceExclTax; decimal.TryParse(form["SubTotalExclTax"], out priceExclTax); //attributes //warnings var warnings = new List<string>(); string attributesXml = ""; #region Product attributes var attributes = _productAttributeService.GetProductAttributeMappingsByProductId(product.Id); foreach (var attribute in attributes) { string controlId = string.Format("product_attribute_{0}", attribute.Id); switch (attribute.AttributeControlType) { case AttributeControlType.DropdownList: case AttributeControlType.RadioList: case AttributeControlType.ColorSquares: case AttributeControlType.ImageSquares: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { int selectedAttributeId = int.Parse(ctrlAttributes); if (selectedAttributeId > 0) attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } break; case AttributeControlType.Checkboxes: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { foreach (var item in ctrlAttributes.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { int selectedAttributeId = int.Parse(item); if (selectedAttributeId > 0) attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } } break; case AttributeControlType.ReadonlyCheckboxes: { //load read-only (already server-side selected) values var attributeValues = _productAttributeService.GetProductAttributeValues(attribute.Id); foreach (var selectedAttributeId in attributeValues .Where(v => v.IsPreSelected) .Select(v => v.Id) .ToList()) { attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedAttributeId.ToString()); } } break; case AttributeControlType.TextBox: case AttributeControlType.MultilineTextbox: { var ctrlAttributes = form[controlId]; if (!String.IsNullOrEmpty(ctrlAttributes)) { string enteredText = ctrlAttributes.Trim(); attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, enteredText); } } break; case AttributeControlType.Datepicker: { var day = form[controlId + "_day"]; var month = form[controlId + "_month"]; var year = form[controlId + "_year"]; DateTime? selectedDate = null; try { selectedDate = new DateTime(Int32.Parse(year), Int32.Parse(month), Int32.Parse(day)); } catch { } if (selectedDate.HasValue) { attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, selectedDate.Value.ToString("D")); } } break; case AttributeControlType.FileUpload: { var httpPostedFile = this.Request.Files[controlId]; if ((httpPostedFile != null) && (!String.IsNullOrEmpty(httpPostedFile.FileName))) { var fileSizeOk = true; if (attribute.ValidationFileMaximumSize.HasValue) { //compare in bytes var maxFileSizeBytes = attribute.ValidationFileMaximumSize.Value * 1024; if (httpPostedFile.ContentLength > maxFileSizeBytes) { warnings.Add(string.Format(_localizationService.GetResource("ShoppingCart.MaximumUploadedFileSize"), attribute.ValidationFileMaximumSize.Value)); fileSizeOk = false; } } if (fileSizeOk) { //save an uploaded file var download = new Download { DownloadGuid = Guid.NewGuid(), UseDownloadUrl = false, DownloadUrl = "", DownloadBinary = httpPostedFile.GetDownloadBits(), ContentType = httpPostedFile.ContentType, Filename = Path.GetFileNameWithoutExtension(httpPostedFile.FileName), Extension = Path.GetExtension(httpPostedFile.FileName), IsNew = true }; _downloadService.InsertDownload(download); //save attribute attributesXml = _productAttributeParser.AddProductAttribute(attributesXml, attribute, download.DownloadGuid.ToString()); } } } break; default: break; } } //validate conditional attributes (if specified) foreach (var attribute in attributes) { var conditionMet = _productAttributeParser.IsConditionMet(attribute, attributesXml); if (conditionMet.HasValue && !conditionMet.Value) { attributesXml = _productAttributeParser.RemoveProductAttribute(attributesXml, attribute); } } #endregion #region Gift cards string recipientName = ""; string recipientEmail = ""; string senderName = ""; string senderEmail = ""; string giftCardMessage = ""; if (product.IsGiftCard) { foreach (string formKey in form.AllKeys) { if (formKey.Equals("giftcard.RecipientName", StringComparison.InvariantCultureIgnoreCase)) { recipientName = form[formKey]; continue; } if (formKey.Equals("giftcard.RecipientEmail", StringComparison.InvariantCultureIgnoreCase)) { recipientEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderName", StringComparison.InvariantCultureIgnoreCase)) { senderName = form[formKey]; continue; } if (formKey.Equals("giftcard.SenderEmail", StringComparison.InvariantCultureIgnoreCase)) { senderEmail = form[formKey]; continue; } if (formKey.Equals("giftcard.Message", StringComparison.InvariantCultureIgnoreCase)) { giftCardMessage = form[formKey]; continue; } } attributesXml = _productAttributeParser.AddGiftCardAttribute(attributesXml, recipientName, recipientEmail, senderName, senderEmail, giftCardMessage); } #endregion #region Rental product DateTime? rentalStartDate = null; DateTime? rentalEndDate = null; if (product.IsRental) { var ctrlStartDate = form["rental_start_date"]; var ctrlEndDate = form["rental_end_date"]; try { //currenly we support only this format (as in the \Views\Order\_ProductAddRentalInfo.cshtml file) const string datePickerFormat = "MM/dd/yyyy"; rentalStartDate = DateTime.ParseExact(ctrlStartDate, datePickerFormat, CultureInfo.InvariantCulture); rentalEndDate = DateTime.ParseExact(ctrlEndDate, datePickerFormat, CultureInfo.InvariantCulture); } catch { } } #endregion //warnings warnings.AddRange(_shoppingCartService.GetShoppingCartItemAttributeWarnings(order.Customer, ShoppingCartType.ShoppingCart, product, quantity, attributesXml)); warnings.AddRange(_shoppingCartService.GetShoppingCartItemGiftCardWarnings(ShoppingCartType.ShoppingCart, product, attributesXml)); warnings.AddRange(_shoppingCartService.GetRentalProductWarnings(product, rentalStartDate, rentalEndDate)); if (warnings.Count == 0) { //no errors //attributes string attributeDescription = _productAttributeFormatter.FormatAttributes(product, attributesXml, order.Customer); //save item var orderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = product.Id, UnitPriceInclTax = unitPriceInclTax, UnitPriceExclTax = unitPriceExclTax, PriceInclTax = priceInclTax, PriceExclTax = priceExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(product, attributesXml), AttributeDescription = attributeDescription, AttributesXml = attributesXml, Quantity = quantity, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, RentalStartDateUtc = rentalStartDate, RentalEndDateUtc = rentalEndDate }; order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //adjust inventory _productService.AdjustInventory(orderItem.Product, -orderItem.Quantity, orderItem.AttributesXml); //add a note order.OrderNotes.Add(new OrderNote { Note = "A new order item has been added", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); //gift cards if (product.IsGiftCard) { for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard { GiftCardType = product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = unitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = recipientName, RecipientEmail = recipientEmail, SenderName = senderName, SenderEmail = senderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } //redirect to order details page return RedirectToAction("Edit", "Order", new { id = order.Id }); } //errors var model = PrepareAddProductToOrderModel(order.Id, product.Id); model.Warnings.AddRange(warnings); return View(model); }
/// <summary> /// Delete an order item /// </summary> /// <param name="orderItem">The order item</param> public virtual void DeleteOrderItem(OrderItem orderItem) { if (orderItem == null) throw new ArgumentNullException("orderItem"); var updatebuilder = Builders<Order>.Update; var updatefilter = updatebuilder.PullFilter(x => x.OrderItems, y => y.Id == orderItem.Id); var result = _orderRepository.Collection.UpdateOneAsync(new BsonDocument("Id", orderItem.OrderId), updatefilter).Result; var updateproduct = Builders<ProductAlsoPurchased>.Update; var updatefilterproduct = updateproduct.PullFilter(x => x.Purchased, y => y.OrderId == orderItem.OrderId && y.ProductId == orderItem.ProductId); var resultproduct = _productAlsoPurchasedRepository.Collection.UpdateManyAsync(new BsonDocument(), updatefilterproduct).Result; //event notification _eventPublisher.EntityDeleted(orderItem); }
/// <summary> /// Process next recurring payment /// </summary> /// <param name="recurringPayment">Recurring payment</param> /// <param name="paymentResult">Process payment result (info about last payment for automatic recurring payments)</param> public virtual void ProcessNextRecurringPayment(RecurringPayment recurringPayment, ProcessPaymentResult paymentResult = null) { if (recurringPayment == null) throw new ArgumentNullException("recurringPayment"); try { if (!recurringPayment.IsActive) throw new NopException("Recurring payment is not active"); var initialOrder = recurringPayment.InitialOrder; if (initialOrder == null) throw new NopException("Initial order could not be loaded"); var customer = initialOrder.Customer; if (customer == null) throw new NopException("Customer could not be loaded"); var nextPaymentDate = recurringPayment.NextPaymentDate; if (!nextPaymentDate.HasValue) throw new NopException("Next payment date could not be calculated"); //payment info var processPaymentRequest = new ProcessPaymentRequest { StoreId = initialOrder.StoreId, CustomerId = customer.Id, OrderGuid = Guid.NewGuid(), InitialOrderId = initialOrder.Id, RecurringCycleLength = recurringPayment.CycleLength, RecurringCyclePeriod = recurringPayment.CyclePeriod, RecurringTotalCycles = recurringPayment.TotalCycles, }; //prepare order details var details = PrepareRecurringOrderDetails(processPaymentRequest); ProcessPaymentResult processPaymentResult; //skip payment workflow if order total equals zero var skipPaymentWorkflow = details.OrderTotal == decimal.Zero; if (!skipPaymentWorkflow) { var paymentMethod = _paymentService.LoadPaymentMethodBySystemName(processPaymentRequest.PaymentMethodSystemName); if (paymentMethod == null) throw new NopException("Payment method couldn't be loaded"); if (!paymentMethod.IsPaymentMethodActive(_paymentSettings)) throw new NopException("Payment method is not active"); //Old credit card info if (details.InitialOrder.AllowStoringCreditCardNumber) { processPaymentRequest.CreditCardType = _encryptionService.DecryptText(details.InitialOrder.CardType); processPaymentRequest.CreditCardName = _encryptionService.DecryptText(details.InitialOrder.CardName); processPaymentRequest.CreditCardNumber = _encryptionService.DecryptText(details.InitialOrder.CardNumber); processPaymentRequest.CreditCardCvv2 = _encryptionService.DecryptText(details.InitialOrder.CardCvv2); try { processPaymentRequest.CreditCardExpireMonth = Convert.ToInt32(_encryptionService.DecryptText(details.InitialOrder.CardExpirationMonth)); processPaymentRequest.CreditCardExpireYear = Convert.ToInt32(_encryptionService.DecryptText(details.InitialOrder.CardExpirationYear)); } catch { } } //payment type switch (_paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName)) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; case RecurringPaymentType.Automatic: //payment is processed on payment gateway site, info about last transaction in paymentResult parameter processPaymentResult = paymentResult ?? new ProcessPaymentResult(); break; default: throw new NopException("Not supported recurring payment type"); } } else processPaymentResult = paymentResult ?? new ProcessPaymentResult { NewPaymentStatus = PaymentStatus.Paid }; if (processPaymentResult == null) throw new NopException("processPaymentResult is not available"); if (processPaymentResult.Success) { //save order details var order = SaveOrderDetails(processPaymentRequest, processPaymentResult, details); foreach (var orderItem in details.InitialOrder.OrderItems) { //save item var newOrderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = orderItem.ProductId, UnitPriceInclTax = orderItem.UnitPriceInclTax, UnitPriceExclTax = orderItem.UnitPriceExclTax, PriceInclTax = orderItem.PriceInclTax, PriceExclTax = orderItem.PriceExclTax, OriginalProductCost = orderItem.OriginalProductCost, AttributeDescription = orderItem.AttributeDescription, AttributesXml = orderItem.AttributesXml, Quantity = orderItem.Quantity, DiscountAmountInclTax = orderItem.DiscountAmountInclTax, DiscountAmountExclTax = orderItem.DiscountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = orderItem.ItemWeight, RentalStartDateUtc = orderItem.RentalStartDateUtc, RentalEndDateUtc = orderItem.RentalEndDateUtc }; order.OrderItems.Add(newOrderItem); _orderService.UpdateOrder(order); //gift cards if (orderItem.Product.IsGiftCard) { string giftCardRecipientName; string giftCardRecipientEmail; string giftCardSenderName; string giftCardSenderEmail; string giftCardMessage; _productAttributeParser.GetGiftCardAttribute(orderItem.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (var i = 0; i < orderItem.Quantity; i++) { _giftCardService.InsertGiftCard(new GiftCard { GiftCardType = orderItem.Product.GiftCardType, PurchasedWithOrderItem = newOrderItem, Amount = orderItem.UnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }); } } //inventory _productService.AdjustInventory(orderItem.Product, -orderItem.Quantity, orderItem.AttributesXml); } //notifications SendNotificationsAndSaveNotes(order); //check order status CheckOrderStatus(order); //raise event _eventPublisher.Publish(new OrderPlacedEvent(order)); if (order.PaymentStatus == PaymentStatus.Paid) ProcessOrderPaid(order); //next recurring payment recurringPayment.RecurringPaymentHistory.Add(new RecurringPaymentHistory { RecurringPayment = recurringPayment, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }); _orderService.UpdateRecurringPayment(recurringPayment); } else { //log errors var logError = processPaymentResult.Errors.Aggregate("Error while processing recurring order. ", (current, next) => string.Format("{0}Error {1}: {2}. ", current, processPaymentResult.Errors.IndexOf(next) + 1, next)); _logger.Error(logError, customer: customer); } } catch (Exception exc) { _logger.Error(string.Format("Error while processing recurring order. {0}", exc.Message), exc); throw; } }
/// <summary> /// Places an order /// </summary> /// <param name="processPaymentRequest">Process payment request</param> /// <returns>Place order result</returns> public virtual PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { if (processPaymentRequest == null) throw new ArgumentNullException("processPaymentRequest"); var result = new PlaceOrderResult(); try { if (processPaymentRequest.OrderGuid == Guid.Empty) processPaymentRequest.OrderGuid = Guid.NewGuid(); //prepare order details var details = PreparePlaceOrderDetails(processPaymentRequest); #region Payment workflow //process payment ProcessPaymentResult processPaymentResult = null; //skip payment workflow if order total equals zero var skipPaymentWorkflow = details.OrderTotal == decimal.Zero; if (!skipPaymentWorkflow) { var paymentMethod = _paymentService.LoadPaymentMethodBySystemName(processPaymentRequest.PaymentMethodSystemName); if (paymentMethod == null) throw new NopException("Payment method couldn't be loaded"); //ensure that payment method is active if (!paymentMethod.IsPaymentMethodActive(_paymentSettings)) throw new NopException("Payment method is not active"); if (details.IsRecurringShoppingCart) { //recurring cart switch (_paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName)) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: case RecurringPaymentType.Automatic: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; default: throw new NopException("Not supported recurring payment type"); } } else //standard cart processPaymentResult = _paymentService.ProcessPayment(processPaymentRequest); } else //payment is not required processPaymentResult = new ProcessPaymentResult { NewPaymentStatus = PaymentStatus.Paid }; if (processPaymentResult == null) throw new NopException("processPaymentResult is not available"); #endregion if (processPaymentResult.Success) { #region Save order details var order = SaveOrderDetails(processPaymentRequest, processPaymentResult, details); result.PlacedOrder = order; //move shopping cart items to order items foreach (var sc in details.Cart) { //prices decimal taxRate; List<Discount> scDiscounts; decimal discountAmount; var scUnitPrice = _priceCalculationService.GetUnitPrice(sc); var scSubTotal = _priceCalculationService.GetSubTotal(sc, true, out discountAmount, out scDiscounts); var scUnitPriceInclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, true, details.Customer, out taxRate); var scUnitPriceExclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, false, details.Customer, out taxRate); var scSubTotalInclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, true, details.Customer, out taxRate); var scSubTotalExclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, false, details.Customer, out taxRate); var discountAmountInclTax = _taxService.GetProductPrice(sc.Product, discountAmount, true, details.Customer, out taxRate); var discountAmountExclTax = _taxService.GetProductPrice(sc.Product, discountAmount, false, details.Customer, out taxRate); foreach (var disc in scDiscounts) if (!details.AppliedDiscounts.ContainsDiscount(disc)) details.AppliedDiscounts.Add(disc); //attributes var attributeDescription = _productAttributeFormatter.FormatAttributes(sc.Product, sc.AttributesXml, details.Customer); var itemWeight = _shippingService.GetShoppingCartItemWeight(sc); //save order item var orderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = sc.ProductId, UnitPriceInclTax = scUnitPriceInclTax, UnitPriceExclTax = scUnitPriceExclTax, PriceInclTax = scSubTotalInclTax, PriceExclTax = scSubTotalExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(sc.Product, sc.AttributesXml), AttributeDescription = attributeDescription, AttributesXml = sc.AttributesXml, Quantity = sc.Quantity, DiscountAmountInclTax = discountAmountInclTax, DiscountAmountExclTax = discountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = itemWeight, RentalStartDateUtc = sc.RentalStartDateUtc, RentalEndDateUtc = sc.RentalEndDateUtc }; order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //gift cards if (sc.Product.IsGiftCard) { string giftCardRecipientName; string giftCardRecipientEmail; string giftCardSenderName; string giftCardSenderEmail; string giftCardMessage; _productAttributeParser.GetGiftCardAttribute(sc.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (var i = 0; i < sc.Quantity; i++) { _giftCardService.InsertGiftCard(new GiftCard { GiftCardType = sc.Product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = sc.Product.OverriddenGiftCardAmount.HasValue ? sc.Product.OverriddenGiftCardAmount.Value : scUnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }); } } //inventory _productService.AdjustInventory(sc.Product, -sc.Quantity, sc.AttributesXml); } //clear shopping cart details.Cart.ToList().ForEach(sci => _shoppingCartService.DeleteShoppingCartItem(sci, false)); //discount usage history foreach (var discount in details.AppliedDiscounts) { _discountService.InsertDiscountUsageHistory(new DiscountUsageHistory { Discount = discount, Order = order, CreatedOnUtc = DateTime.UtcNow }); } //gift card usage history if (details.AppliedGiftCards != null) foreach (var agc in details.AppliedGiftCards) { agc.GiftCard.GiftCardUsageHistory.Add(new GiftCardUsageHistory { GiftCard = agc.GiftCard, UsedWithOrder = order, UsedValue = agc.AmountCanBeUsed, CreatedOnUtc = DateTime.UtcNow }); _giftCardService.UpdateGiftCard(agc.GiftCard); } //recurring orders if (details.IsRecurringShoppingCart) { //create recurring payment (the first payment) var rp = new RecurringPayment { CycleLength = processPaymentRequest.RecurringCycleLength, CyclePeriod = processPaymentRequest.RecurringCyclePeriod, TotalCycles = processPaymentRequest.RecurringTotalCycles, StartDateUtc = DateTime.UtcNow, IsActive = true, CreatedOnUtc = DateTime.UtcNow, InitialOrder = order, }; _orderService.InsertRecurringPayment(rp); switch (_paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName)) { case RecurringPaymentType.NotSupported: //not supported break; case RecurringPaymentType.Manual: rp.RecurringPaymentHistory.Add(new RecurringPaymentHistory { RecurringPayment = rp, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }); _orderService.UpdateRecurringPayment(rp); break; case RecurringPaymentType.Automatic: //will be created later (process is automated) break; default: break; } } #endregion //notifications SendNotificationsAndSaveNotes(order); //reset checkout data _customerService.ResetCheckoutData(details.Customer, processPaymentRequest.StoreId, clearCouponCodes: true, clearCheckoutAttributes: true); _customerActivityService.InsertActivity("PublicStore.PlaceOrder", _localizationService.GetResource("ActivityLog.PublicStore.PlaceOrder"), order.Id); //check order status CheckOrderStatus(order); //raise event _eventPublisher.Publish(new OrderPlacedEvent(order)); if (order.PaymentStatus == PaymentStatus.Paid) ProcessOrderPaid(order); } else foreach (var paymentError in processPaymentResult.Errors) result.AddError(string.Format(_localizationService.GetResource("Checkout.PaymentError"), paymentError)); } catch (Exception exc) { _logger.Error(exc.Message, exc); result.AddError(exc.Message); } #region Process errors if (!result.Success) { //log errors var logError = result.Errors.Aggregate("Error while placing order. ", (current, next) => string.Format("{0}Error {1}: {2}. ", current, result.Errors.IndexOf(next) + 1, next)); var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); _logger.Error(logError, customer: customer); } #endregion return result; }
/// <summary> /// Sends 'Return Request status changed' message to a customer /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="orderItem">Order item</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendReturnRequestStatusChangedCustomerNotification(ReturnRequest returnRequest, OrderItem orderItem, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var store = _storeService.GetStoreById(orderItem.Order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetActiveMessageTemplate("ReturnRequestStatusChanged.CustomerNotification", store.Id); if (messageTemplate == null) return 0; //email account var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store, emailAccount); _messageTokenProvider.AddCustomerTokens(tokens, returnRequest.Customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, orderItem); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); string toEmail = returnRequest.Customer.IsGuest() ? orderItem.Order.BillingAddress.Email : returnRequest.Customer.Email; var toName = returnRequest.Customer.IsGuest() ? orderItem.Order.BillingAddress.FirstName : returnRequest.Customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
/// <summary> /// Places an order /// </summary> /// <param name="processPaymentRequest">Process payment request</param> /// <returns>Place order result</returns> public virtual PlaceOrderResult PlaceOrder(ProcessPaymentRequest processPaymentRequest) { //think about moving functionality of processing recurring orders (after the initial order was placed) to ProcessNextRecurringPayment() method if (processPaymentRequest == null) throw new ArgumentNullException("processPaymentRequest"); if (processPaymentRequest.OrderGuid == Guid.Empty) processPaymentRequest.OrderGuid = Guid.NewGuid(); var result = new PlaceOrderResult(); try { #region Order details (customer, addresses, totals) //Recurring orders. Load initial order Order initialOrder = _orderService.GetOrderById(processPaymentRequest.InitialOrderId); if (processPaymentRequest.IsRecurringPayment) { if (initialOrder == null) throw new ArgumentException("Initial order is not set for recurring payment"); processPaymentRequest.PaymentMethodSystemName = initialOrder.PaymentMethodSystemName; } //customer var customer = _customerService.GetCustomerById(processPaymentRequest.CustomerId); if (customer == null) throw new ArgumentException("Customer is not set"); //affilites int affiliateId = 0; var affiliate = _affiliateService.GetAffiliateById(customer.AffiliateId); if (affiliate != null && affiliate.Active && !affiliate.Deleted) affiliateId = affiliate.Id; //customer currency string customerCurrencyCode = ""; decimal customerCurrencyRate; if (!processPaymentRequest.IsRecurringPayment) { var currencyTmp = _currencyService.GetCurrencyById(customer.GetAttribute<int>(SystemCustomerAttributeNames.CurrencyId, processPaymentRequest.StoreId)); var customerCurrency = (currencyTmp != null && currencyTmp.Published) ? currencyTmp : _workContext.WorkingCurrency; customerCurrencyCode = customerCurrency.CurrencyCode; var primaryStoreCurrency = _currencyService.GetCurrencyById(_currencySettings.PrimaryStoreCurrencyId); customerCurrencyRate = customerCurrency.Rate / primaryStoreCurrency.Rate; } else { customerCurrencyCode = initialOrder.CustomerCurrencyCode; customerCurrencyRate = initialOrder.CurrencyRate; } //customer language Language customerLanguage; if (!processPaymentRequest.IsRecurringPayment) { customerLanguage = _languageService.GetLanguageById(customer.GetAttribute<int>( SystemCustomerAttributeNames.LanguageId, processPaymentRequest.StoreId)); } else { customerLanguage = _languageService.GetLanguageById(initialOrder.CustomerLanguageId); } if (customerLanguage == null || !customerLanguage.Published) customerLanguage = _workContext.WorkingLanguage; //check whether customer is guest if (customer.IsGuest() && !_orderSettings.AnonymousCheckoutAllowed) throw new NopException("Anonymous checkout is not allowed"); //billing address Address billingAddress; if (!processPaymentRequest.IsRecurringPayment) { if (customer.BillingAddress == null) throw new NopException("Billing address is not provided"); if (!CommonHelper.IsValidEmail(customer.BillingAddress.Email)) throw new NopException("Email is not valid"); //clone billing address billingAddress = (Address)customer.BillingAddress.Clone(); if (billingAddress.Country != null && !billingAddress.Country.AllowsBilling) throw new NopException(string.Format("Country '{0}' is not allowed for billing", billingAddress.Country.Name)); } else { if (initialOrder.BillingAddress == null) throw new NopException("Billing address is not available"); //clone billing address billingAddress = (Address)initialOrder.BillingAddress.Clone(); if (billingAddress.Country != null && !billingAddress.Country.AllowsBilling) throw new NopException(string.Format("Country '{0}' is not allowed for billing", billingAddress.Country.Name)); } //checkout attributes string checkoutAttributeDescription, checkoutAttributesXml; if (!processPaymentRequest.IsRecurringPayment) { checkoutAttributesXml = customer.GetAttribute<string>(SystemCustomerAttributeNames.CheckoutAttributes, processPaymentRequest.StoreId); checkoutAttributeDescription = _checkoutAttributeFormatter.FormatAttributes(checkoutAttributesXml, customer); } else { checkoutAttributesXml = initialOrder.CheckoutAttributesXml; checkoutAttributeDescription = initialOrder.CheckoutAttributeDescription; } //load and validate customer shopping cart IList<ShoppingCartItem> cart = null; if (!processPaymentRequest.IsRecurringPayment) { //load shopping cart cart = customer.ShoppingCartItems .Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart) .LimitPerStore(processPaymentRequest.StoreId) .ToList(); if (cart.Count == 0) throw new NopException("Cart is empty"); //validate the entire shopping cart var warnings = _shoppingCartService.GetShoppingCartWarnings(cart, checkoutAttributesXml, true); if (warnings.Count > 0) { var warningsSb = new StringBuilder(); foreach (string warning in warnings) { warningsSb.Append(warning); warningsSb.Append(";"); } throw new NopException(warningsSb.ToString()); } //validate individual cart items foreach (var sci in cart) { var sciWarnings = _shoppingCartService.GetShoppingCartItemWarnings(customer, sci.ShoppingCartType, sci.Product, processPaymentRequest.StoreId, sci.AttributesXml, sci.CustomerEnteredPrice, sci.RentalStartDateUtc, sci.RentalEndDateUtc, sci.Quantity, false); if (sciWarnings.Count > 0) { var warningsSb = new StringBuilder(); foreach (string warning in sciWarnings) { warningsSb.Append(warning); warningsSb.Append(";"); } throw new NopException(warningsSb.ToString()); } } } //min totals validation if (!processPaymentRequest.IsRecurringPayment) { bool minOrderSubtotalAmountOk = ValidateMinOrderSubtotalAmount(cart); if (!minOrderSubtotalAmountOk) { decimal minOrderSubtotalAmount = _currencyService.ConvertFromPrimaryStoreCurrency(_orderSettings.MinOrderSubtotalAmount, _workContext.WorkingCurrency); throw new NopException(string.Format(_localizationService.GetResource("Checkout.MinOrderSubtotalAmount"), _priceFormatter.FormatPrice(minOrderSubtotalAmount, true, false))); } bool minOrderTotalAmountOk = ValidateMinOrderTotalAmount(cart); if (!minOrderTotalAmountOk) { decimal minOrderTotalAmount = _currencyService.ConvertFromPrimaryStoreCurrency(_orderSettings.MinOrderTotalAmount, _workContext.WorkingCurrency); throw new NopException(string.Format(_localizationService.GetResource("Checkout.MinOrderTotalAmount"), _priceFormatter.FormatPrice(minOrderTotalAmount, true, false))); } } //tax display type var customerTaxDisplayType = TaxDisplayType.IncludingTax; if (!processPaymentRequest.IsRecurringPayment) { if (_taxSettings.AllowCustomersToSelectTaxDisplayType) customerTaxDisplayType = (TaxDisplayType)customer.GetAttribute<int>(SystemCustomerAttributeNames.TaxDisplayTypeId, processPaymentRequest.StoreId); else customerTaxDisplayType = _taxSettings.TaxDisplayType; } else { customerTaxDisplayType = initialOrder.CustomerTaxDisplayType; } //applied discount (used to store discount usage history) var appliedDiscounts = new List<Discount>(); //sub total decimal orderSubTotalInclTax, orderSubTotalExclTax; decimal orderSubTotalDiscountInclTax = 0, orderSubTotalDiscountExclTax = 0; if (!processPaymentRequest.IsRecurringPayment) { //sub total (incl tax) decimal orderSubTotalDiscountAmount1; Discount orderSubTotalAppliedDiscount1; decimal subTotalWithoutDiscountBase1; decimal subTotalWithDiscountBase1; _orderTotalCalculationService.GetShoppingCartSubTotal(cart, true, out orderSubTotalDiscountAmount1, out orderSubTotalAppliedDiscount1, out subTotalWithoutDiscountBase1, out subTotalWithDiscountBase1); orderSubTotalInclTax = subTotalWithoutDiscountBase1; orderSubTotalDiscountInclTax = orderSubTotalDiscountAmount1; //discount history if (orderSubTotalAppliedDiscount1 != null && !appliedDiscounts.ContainsDiscount(orderSubTotalAppliedDiscount1)) appliedDiscounts.Add(orderSubTotalAppliedDiscount1); //sub total (excl tax) decimal orderSubTotalDiscountAmount2; Discount orderSubTotalAppliedDiscount2; decimal subTotalWithoutDiscountBase2; decimal subTotalWithDiscountBase2; _orderTotalCalculationService.GetShoppingCartSubTotal(cart, false, out orderSubTotalDiscountAmount2, out orderSubTotalAppliedDiscount2, out subTotalWithoutDiscountBase2, out subTotalWithDiscountBase2); orderSubTotalExclTax = subTotalWithoutDiscountBase2; orderSubTotalDiscountExclTax = orderSubTotalDiscountAmount2; } else { orderSubTotalInclTax = initialOrder.OrderSubtotalInclTax; orderSubTotalExclTax = initialOrder.OrderSubtotalExclTax; } //shipping info bool shoppingCartRequiresShipping = false; if (!processPaymentRequest.IsRecurringPayment) { shoppingCartRequiresShipping = cart.RequiresShipping(); } else { shoppingCartRequiresShipping = initialOrder.ShippingStatus != ShippingStatus.ShippingNotRequired; } Address shippingAddress = null; string shippingMethodName = "", shippingRateComputationMethodSystemName = ""; bool pickUpInStore = false; if (shoppingCartRequiresShipping) { if (!processPaymentRequest.IsRecurringPayment) { pickUpInStore = _shippingSettings.AllowPickUpInStore && customer.GetAttribute<bool>(SystemCustomerAttributeNames.SelectedPickUpInStore, processPaymentRequest.StoreId); if (!pickUpInStore) { if (customer.ShippingAddress == null) throw new NopException("Shipping address is not provided"); if (!CommonHelper.IsValidEmail(customer.ShippingAddress.Email)) throw new NopException("Email is not valid"); //clone shipping address shippingAddress = (Address) customer.ShippingAddress.Clone(); if (shippingAddress.Country != null && !shippingAddress.Country.AllowsShipping) { throw new NopException(string.Format("Country '{0}' is not allowed for shipping", shippingAddress.Country.Name)); } } var shippingOption = customer.GetAttribute<ShippingOption>(SystemCustomerAttributeNames.SelectedShippingOption, processPaymentRequest.StoreId); if (shippingOption != null) { shippingMethodName = shippingOption.Name; shippingRateComputationMethodSystemName = shippingOption.ShippingRateComputationMethodSystemName; } } else { pickUpInStore = initialOrder.PickUpInStore; if (!pickUpInStore) { if (initialOrder.ShippingAddress == null) throw new NopException("Shipping address is not available"); //clone shipping address shippingAddress = (Address) initialOrder.ShippingAddress.Clone(); if (shippingAddress.Country != null && !shippingAddress.Country.AllowsShipping) { throw new NopException(string.Format("Country '{0}' is not allowed for shipping", shippingAddress.Country.Name)); } } shippingMethodName = initialOrder.ShippingMethod; shippingRateComputationMethodSystemName = initialOrder.ShippingRateComputationMethodSystemName; } } //shipping total decimal? orderShippingTotalInclTax, orderShippingTotalExclTax = null; if (!processPaymentRequest.IsRecurringPayment) { decimal taxRate; Discount shippingTotalDiscount; orderShippingTotalInclTax = _orderTotalCalculationService.GetShoppingCartShippingTotal(cart, true, out taxRate, out shippingTotalDiscount); orderShippingTotalExclTax = _orderTotalCalculationService.GetShoppingCartShippingTotal(cart, false); if (!orderShippingTotalInclTax.HasValue || !orderShippingTotalExclTax.HasValue) throw new NopException("Shipping total couldn't be calculated"); if (shippingTotalDiscount != null && !appliedDiscounts.ContainsDiscount(shippingTotalDiscount)) appliedDiscounts.Add(shippingTotalDiscount); } else { orderShippingTotalInclTax = initialOrder.OrderShippingInclTax; orderShippingTotalExclTax = initialOrder.OrderShippingExclTax; } //payment total decimal paymentAdditionalFeeInclTax, paymentAdditionalFeeExclTax; if (!processPaymentRequest.IsRecurringPayment) { decimal paymentAdditionalFee = _paymentService.GetAdditionalHandlingFee(cart, processPaymentRequest.PaymentMethodSystemName); paymentAdditionalFeeInclTax = _taxService.GetPaymentMethodAdditionalFee(paymentAdditionalFee, true, customer); paymentAdditionalFeeExclTax = _taxService.GetPaymentMethodAdditionalFee(paymentAdditionalFee, false, customer); } else { paymentAdditionalFeeInclTax = initialOrder.PaymentMethodAdditionalFeeInclTax; paymentAdditionalFeeExclTax = initialOrder.PaymentMethodAdditionalFeeExclTax; } //tax total decimal orderTaxTotal = decimal.Zero; string vatNumber = "", taxRates = ""; if (!processPaymentRequest.IsRecurringPayment) { //tax amount SortedDictionary<decimal, decimal> taxRatesDictionary; orderTaxTotal = _orderTotalCalculationService.GetTaxTotal(cart, out taxRatesDictionary); //VAT number var customerVatStatus = (VatNumberStatus)customer.GetAttribute<int>(SystemCustomerAttributeNames.VatNumberStatusId); if (_taxSettings.EuVatEnabled && customerVatStatus == VatNumberStatus.Valid) vatNumber = customer.GetAttribute<string>(SystemCustomerAttributeNames.VatNumber); //tax rates foreach (var kvp in taxRatesDictionary) { var taxRate = kvp.Key; var taxValue = kvp.Value; taxRates += string.Format("{0}:{1}; ", taxRate.ToString(CultureInfo.InvariantCulture), taxValue.ToString(CultureInfo.InvariantCulture)); } } else { orderTaxTotal = initialOrder.OrderTax; //VAT number vatNumber = initialOrder.VatNumber; } //order total (and applied discounts, gift cards, reward points) decimal? orderTotal = null; decimal orderDiscountAmount = decimal.Zero; List<AppliedGiftCard> appliedGiftCards = null; int redeemedRewardPoints = 0; decimal redeemedRewardPointsAmount = decimal.Zero; if (!processPaymentRequest.IsRecurringPayment) { Discount orderAppliedDiscount; orderTotal = _orderTotalCalculationService.GetShoppingCartTotal(cart, out orderDiscountAmount, out orderAppliedDiscount, out appliedGiftCards, out redeemedRewardPoints, out redeemedRewardPointsAmount); if (!orderTotal.HasValue) throw new NopException("Order total couldn't be calculated"); //discount history if (orderAppliedDiscount != null && !appliedDiscounts.ContainsDiscount(orderAppliedDiscount)) appliedDiscounts.Add(orderAppliedDiscount); } else { orderDiscountAmount = initialOrder.OrderDiscount; orderTotal = initialOrder.OrderTotal; } processPaymentRequest.OrderTotal = orderTotal.Value; #endregion #region Payment workflow //skip payment workflow if order total equals zero bool skipPaymentWorkflow = orderTotal.Value == decimal.Zero; //payment workflow if (!skipPaymentWorkflow) { var paymentMethod = _paymentService.LoadPaymentMethodBySystemName(processPaymentRequest.PaymentMethodSystemName); if (paymentMethod == null) throw new NopException("Payment method couldn't be loaded"); //ensure that payment method is active if (!paymentMethod.IsPaymentMethodActive(_paymentSettings)) throw new NopException("Payment method is not active"); } else processPaymentRequest.PaymentMethodSystemName = ""; //recurring or standard shopping cart? bool isRecurringShoppingCart = false; if (!processPaymentRequest.IsRecurringPayment) { isRecurringShoppingCart = cart.IsRecurring(); if (isRecurringShoppingCart) { int recurringCycleLength; RecurringProductCyclePeriod recurringCyclePeriod; int recurringTotalCycles; string recurringCyclesError = cart.GetRecurringCycleInfo(_localizationService, out recurringCycleLength, out recurringCyclePeriod, out recurringTotalCycles); if (!string.IsNullOrEmpty(recurringCyclesError)) throw new NopException(recurringCyclesError); processPaymentRequest.RecurringCycleLength = recurringCycleLength; processPaymentRequest.RecurringCyclePeriod = recurringCyclePeriod; processPaymentRequest.RecurringTotalCycles = recurringTotalCycles; } } else isRecurringShoppingCart = true; //process payment ProcessPaymentResult processPaymentResult = null; if (!skipPaymentWorkflow) { if (!processPaymentRequest.IsRecurringPayment) { if (isRecurringShoppingCart) { //recurring cart var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: case RecurringPaymentType.Automatic: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; default: throw new NopException("Not supported recurring payment type"); } } else { //standard cart processPaymentResult = _paymentService.ProcessPayment(processPaymentRequest); } } else { if (isRecurringShoppingCart) { //Old credit card info processPaymentRequest.CreditCardType = initialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(initialOrder.CardType) : ""; processPaymentRequest.CreditCardName = initialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(initialOrder.CardName) : ""; processPaymentRequest.CreditCardNumber = initialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(initialOrder.CardNumber) : ""; //MaskedCreditCardNumber processPaymentRequest.CreditCardCvv2 = initialOrder.AllowStoringCreditCardNumber ? _encryptionService.DecryptText(initialOrder.CardCvv2) : ""; try { processPaymentRequest.CreditCardExpireMonth = initialOrder.AllowStoringCreditCardNumber ? Convert.ToInt32(_encryptionService.DecryptText(initialOrder.CardExpirationMonth)) : 0; processPaymentRequest.CreditCardExpireYear = initialOrder.AllowStoringCreditCardNumber ? Convert.ToInt32(_encryptionService.DecryptText(initialOrder.CardExpirationYear)) : 0; } catch {} var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: throw new NopException("Recurring payments are not supported by selected payment method"); case RecurringPaymentType.Manual: processPaymentResult = _paymentService.ProcessRecurringPayment(processPaymentRequest); break; case RecurringPaymentType.Automatic: //payment is processed on payment gateway site processPaymentResult = new ProcessPaymentResult(); break; default: throw new NopException("Not supported recurring payment type"); } } else { throw new NopException("No recurring products"); } } } else { //payment is not required if (processPaymentResult == null) processPaymentResult = new ProcessPaymentResult(); processPaymentResult.NewPaymentStatus = PaymentStatus.Paid; } if (processPaymentResult == null) throw new NopException("processPaymentResult is not available"); #endregion if (processPaymentResult.Success) { //save order in data storage //uncomment this line to support transactions //using (var scope = new System.Transactions.TransactionScope()) { #region Save order details var shippingStatus = ShippingStatus.NotYetShipped; if (!shoppingCartRequiresShipping) shippingStatus = ShippingStatus.ShippingNotRequired; var order = new Order { StoreId = processPaymentRequest.StoreId, OrderGuid = processPaymentRequest.OrderGuid, CustomerId = customer.Id, CustomerLanguageId = customerLanguage.Id, CustomerTaxDisplayType = customerTaxDisplayType, CustomerIp = _webHelper.GetCurrentIpAddress(), OrderSubtotalInclTax = orderSubTotalInclTax, OrderSubtotalExclTax = orderSubTotalExclTax, OrderSubTotalDiscountInclTax = orderSubTotalDiscountInclTax, OrderSubTotalDiscountExclTax = orderSubTotalDiscountExclTax, OrderShippingInclTax = orderShippingTotalInclTax.Value, OrderShippingExclTax = orderShippingTotalExclTax.Value, PaymentMethodAdditionalFeeInclTax = paymentAdditionalFeeInclTax, PaymentMethodAdditionalFeeExclTax = paymentAdditionalFeeExclTax, TaxRates = taxRates, OrderTax = orderTaxTotal, OrderTotal = orderTotal.Value, RefundedAmount = decimal.Zero, OrderDiscount = orderDiscountAmount, CheckoutAttributeDescription = checkoutAttributeDescription, CheckoutAttributesXml = checkoutAttributesXml, CustomerCurrencyCode = customerCurrencyCode, CurrencyRate = customerCurrencyRate, AffiliateId = affiliateId, OrderStatus = OrderStatus.Pending, AllowStoringCreditCardNumber = processPaymentResult.AllowStoringCreditCardNumber, CardType = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardType) : string.Empty, CardName = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardName) : string.Empty, CardNumber = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardNumber) : string.Empty, MaskedCreditCardNumber = _encryptionService.EncryptText(_paymentService.GetMaskedCreditCardNumber(processPaymentRequest.CreditCardNumber)), CardCvv2 = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardCvv2) : string.Empty, CardExpirationMonth = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardExpireMonth.ToString()) : string.Empty, CardExpirationYear = processPaymentResult.AllowStoringCreditCardNumber ? _encryptionService.EncryptText(processPaymentRequest.CreditCardExpireYear.ToString()) : string.Empty, PaymentMethodSystemName = processPaymentRequest.PaymentMethodSystemName, AuthorizationTransactionId = processPaymentResult.AuthorizationTransactionId, AuthorizationTransactionCode = processPaymentResult.AuthorizationTransactionCode, AuthorizationTransactionResult = processPaymentResult.AuthorizationTransactionResult, CaptureTransactionId = processPaymentResult.CaptureTransactionId, CaptureTransactionResult = processPaymentResult.CaptureTransactionResult, SubscriptionTransactionId = processPaymentResult.SubscriptionTransactionId, PaymentStatus = processPaymentResult.NewPaymentStatus, PaidDateUtc = null, BillingAddress = billingAddress, ShippingAddress = shippingAddress, ShippingStatus = shippingStatus, ShippingMethod = shippingMethodName, PickUpInStore = pickUpInStore, ShippingRateComputationMethodSystemName = shippingRateComputationMethodSystemName, CustomValuesXml = processPaymentRequest.SerializeCustomValues(), VatNumber = vatNumber, CreatedOnUtc = DateTime.UtcNow }; _orderService.InsertOrder(order); result.PlacedOrder = order; if (!processPaymentRequest.IsRecurringPayment) { //move shopping cart items to order items foreach (var sc in cart) { //prices decimal taxRate; Discount scDiscount; decimal discountAmount; decimal scUnitPrice = _priceCalculationService.GetUnitPrice(sc); decimal scSubTotal = _priceCalculationService.GetSubTotal(sc, true, out discountAmount, out scDiscount); decimal scUnitPriceInclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, true, customer, out taxRate); decimal scUnitPriceExclTax = _taxService.GetProductPrice(sc.Product, scUnitPrice, false, customer, out taxRate); decimal scSubTotalInclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, true, customer, out taxRate); decimal scSubTotalExclTax = _taxService.GetProductPrice(sc.Product, scSubTotal, false, customer, out taxRate); decimal discountAmountInclTax = _taxService.GetProductPrice(sc.Product, discountAmount, true, customer, out taxRate); decimal discountAmountExclTax = _taxService.GetProductPrice(sc.Product, discountAmount, false, customer, out taxRate); if (scDiscount != null && !appliedDiscounts.ContainsDiscount(scDiscount)) appliedDiscounts.Add(scDiscount); //attributes string attributeDescription = _productAttributeFormatter.FormatAttributes(sc.Product, sc.AttributesXml, customer); var itemWeight = _shippingService.GetShoppingCartItemWeight(sc); //save order item var orderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = sc.ProductId, UnitPriceInclTax = scUnitPriceInclTax, UnitPriceExclTax = scUnitPriceExclTax, PriceInclTax = scSubTotalInclTax, PriceExclTax = scSubTotalExclTax, OriginalProductCost = _priceCalculationService.GetProductCost(sc.Product, sc.AttributesXml), AttributeDescription = attributeDescription, AttributesXml = sc.AttributesXml, Quantity = sc.Quantity, DiscountAmountInclTax = discountAmountInclTax, DiscountAmountExclTax = discountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = itemWeight, RentalStartDateUtc = sc.RentalStartDateUtc, RentalEndDateUtc = sc.RentalEndDateUtc }; order.OrderItems.Add(orderItem); _orderService.UpdateOrder(order); //gift cards if (sc.Product.IsGiftCard) { string giftCardRecipientName, giftCardRecipientEmail, giftCardSenderName, giftCardSenderEmail, giftCardMessage; _productAttributeParser.GetGiftCardAttribute(sc.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (int i = 0; i < sc.Quantity; i++) { var gc = new GiftCard { GiftCardType = sc.Product.GiftCardType, PurchasedWithOrderItem = orderItem, Amount = scUnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } //inventory _productService.AdjustInventory(sc.Product, -sc.Quantity, sc.AttributesXml); } //clear shopping cart cart.ToList().ForEach(sci => _shoppingCartService.DeleteShoppingCartItem(sci, false)); } else { //recurring payment var initialOrderItems = initialOrder.OrderItems; foreach (var orderItem in initialOrderItems) { //save item var newOrderItem = new OrderItem { OrderItemGuid = Guid.NewGuid(), Order = order, ProductId = orderItem.ProductId, UnitPriceInclTax = orderItem.UnitPriceInclTax, UnitPriceExclTax = orderItem.UnitPriceExclTax, PriceInclTax = orderItem.PriceInclTax, PriceExclTax = orderItem.PriceExclTax, OriginalProductCost = orderItem.OriginalProductCost, AttributeDescription = orderItem.AttributeDescription, AttributesXml = orderItem.AttributesXml, Quantity = orderItem.Quantity, DiscountAmountInclTax = orderItem.DiscountAmountInclTax, DiscountAmountExclTax = orderItem.DiscountAmountExclTax, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = orderItem.ItemWeight, RentalStartDateUtc = orderItem.RentalStartDateUtc, RentalEndDateUtc = orderItem.RentalEndDateUtc }; order.OrderItems.Add(newOrderItem); _orderService.UpdateOrder(order); //gift cards if (orderItem.Product.IsGiftCard) { string giftCardRecipientName, giftCardRecipientEmail, giftCardSenderName, giftCardSenderEmail, giftCardMessage; _productAttributeParser.GetGiftCardAttribute(orderItem.AttributesXml, out giftCardRecipientName, out giftCardRecipientEmail, out giftCardSenderName, out giftCardSenderEmail, out giftCardMessage); for (int i = 0; i < orderItem.Quantity; i++) { var gc = new GiftCard { GiftCardType = orderItem.Product.GiftCardType, PurchasedWithOrderItem = newOrderItem, Amount = orderItem.UnitPriceExclTax, IsGiftCardActivated = false, GiftCardCouponCode = _giftCardService.GenerateGiftCardCode(), RecipientName = giftCardRecipientName, RecipientEmail = giftCardRecipientEmail, SenderName = giftCardSenderName, SenderEmail = giftCardSenderEmail, Message = giftCardMessage, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardService.InsertGiftCard(gc); } } //inventory _productService.AdjustInventory(orderItem.Product, -orderItem.Quantity, orderItem.AttributesXml); } } //discount usage history if (!processPaymentRequest.IsRecurringPayment) foreach (var discount in appliedDiscounts) { var duh = new DiscountUsageHistory { Discount = discount, Order = order, CreatedOnUtc = DateTime.UtcNow }; _discountService.InsertDiscountUsageHistory(duh); } //gift card usage history if (!processPaymentRequest.IsRecurringPayment) if (appliedGiftCards != null) foreach (var agc in appliedGiftCards) { decimal amountUsed = agc.AmountCanBeUsed; var gcuh = new GiftCardUsageHistory { GiftCard = agc.GiftCard, UsedWithOrder = order, UsedValue = amountUsed, CreatedOnUtc = DateTime.UtcNow }; agc.GiftCard.GiftCardUsageHistory.Add(gcuh); _giftCardService.UpdateGiftCard(agc.GiftCard); } //reward points history if (redeemedRewardPointsAmount > decimal.Zero) { customer.AddRewardPointsHistoryEntry(-redeemedRewardPoints, string.Format(_localizationService.GetResource("RewardPoints.Message.RedeemedForOrder", order.CustomerLanguageId), order.Id), order, redeemedRewardPointsAmount); _customerService.UpdateCustomer(customer); } //recurring orders if (!processPaymentRequest.IsRecurringPayment && isRecurringShoppingCart) { //create recurring payment (the first payment) var rp = new RecurringPayment { CycleLength = processPaymentRequest.RecurringCycleLength, CyclePeriod = processPaymentRequest.RecurringCyclePeriod, TotalCycles = processPaymentRequest.RecurringTotalCycles, StartDateUtc = DateTime.UtcNow, IsActive = true, CreatedOnUtc = DateTime.UtcNow, InitialOrder = order, }; _orderService.InsertRecurringPayment(rp); var recurringPaymentType = _paymentService.GetRecurringPaymentType(processPaymentRequest.PaymentMethodSystemName); switch (recurringPaymentType) { case RecurringPaymentType.NotSupported: { //not supported } break; case RecurringPaymentType.Manual: { //first payment var rph = new RecurringPaymentHistory { RecurringPayment = rp, CreatedOnUtc = DateTime.UtcNow, OrderId = order.Id, }; rp.RecurringPaymentHistory.Add(rph); _orderService.UpdateRecurringPayment(rp); } break; case RecurringPaymentType.Automatic: { //will be created later (process is automated) } break; default: break; } } #endregion #region Notifications & notes //notes, messages if (_workContext.OriginalCustomerIfImpersonated != null) { //this order is placed by a store administrator impersonating a customer order.OrderNotes.Add(new OrderNote { Note = string.Format( "Order placed by a store owner ('{0}'. ID = {1}) impersonating the customer.", _workContext.OriginalCustomerIfImpersonated.Email, _workContext.OriginalCustomerIfImpersonated.Id), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } else { order.OrderNotes.Add(new OrderNote { Note = "Order placed", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } //send email notifications int orderPlacedStoreOwnerNotificationQueuedEmailId = _workflowMessageService.SendOrderPlacedStoreOwnerNotification(order, _localizationSettings.DefaultAdminLanguageId); if (orderPlacedStoreOwnerNotificationQueuedEmailId > 0) { order.OrderNotes.Add(new OrderNote { Note = string.Format("\"Order placed\" email (to store owner) has been queued. Queued email identifier: {0}.", orderPlacedStoreOwnerNotificationQueuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } var orderPlacedAttachmentFilePath = _orderSettings.AttachPdfInvoiceToOrderPlacedEmail ? _pdfService.PrintOrderToPdf(order, 0) : null; var orderPlacedAttachmentFileName = _orderSettings.AttachPdfInvoiceToOrderPlacedEmail ? "order.pdf" : null; int orderPlacedCustomerNotificationQueuedEmailId = _workflowMessageService .SendOrderPlacedCustomerNotification(order, order.CustomerLanguageId, orderPlacedAttachmentFilePath, orderPlacedAttachmentFileName); if (orderPlacedCustomerNotificationQueuedEmailId > 0) { order.OrderNotes.Add(new OrderNote { Note = string.Format("\"Order placed\" email (to customer) has been queued. Queued email identifier: {0}.", orderPlacedCustomerNotificationQueuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } var vendors = GetVendorsInOrder(order); foreach (var vendor in vendors) { int orderPlacedVendorNotificationQueuedEmailId = _workflowMessageService.SendOrderPlacedVendorNotification(order, vendor, order.CustomerLanguageId); if (orderPlacedVendorNotificationQueuedEmailId > 0) { order.OrderNotes.Add(new OrderNote { Note = string.Format("\"Order placed\" email (to vendor) has been queued. Queued email identifier: {0}.", orderPlacedVendorNotificationQueuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } } //check order status CheckOrderStatus(order); //reset checkout data if (!processPaymentRequest.IsRecurringPayment) _customerService.ResetCheckoutData(customer, processPaymentRequest.StoreId, clearCouponCodes: true, clearCheckoutAttributes: true); if (!processPaymentRequest.IsRecurringPayment) { _customerActivityService.InsertActivity( "PublicStore.PlaceOrder", _localizationService.GetResource("ActivityLog.PublicStore.PlaceOrder"), order.Id); } //uncomment this line to support transactions //scope.Complete(); //raise event _eventPublisher.Publish(new OrderPlacedEvent(order)); if (order.PaymentStatus == PaymentStatus.Paid) { ProcessOrderPaid(order); } #endregion } } else { foreach (var paymentError in processPaymentResult.Errors) result.AddError(string.Format("Payment error: {0}", paymentError)); } } catch (Exception exc) { _logger.Error(exc.Message, exc); result.AddError(exc.Message); } #region Process errors string error = ""; for (int i = 0; i < result.Errors.Count; i++) { error += string.Format("Error {0}: {1}", i + 1, result.Errors[i]); if (i != result.Errors.Count - 1) error += ". "; } if (!String.IsNullOrEmpty(error)) { //log it string logError = string.Format("Error while placing order. {0}", error); _logger.Error(logError); } #endregion return result; }
protected virtual void InstallOrders() { //default store var defaultStore = _storeRepository.Table.FirstOrDefault(); if (defaultStore == null) throw new Exception("No default store could be loaded"); //first order var firstCustomer = _customerRepository.Table.First(c => c.Email.Equals("*****@*****.**")); var firstOrder = new Order() { StoreId = defaultStore.Id, OrderGuid = Guid.NewGuid(), Customer = firstCustomer, CustomerLanguageId = _languageRepository.Table.First().Id, CustomerIp = "127.0.0.1", OrderSubtotalInclTax = 1855M, OrderSubtotalExclTax = 1855M, OrderSubTotalDiscountInclTax = decimal.Zero, OrderSubTotalDiscountExclTax = decimal.Zero, OrderShippingInclTax = decimal.Zero, OrderShippingExclTax = decimal.Zero, PaymentMethodAdditionalFeeInclTax = decimal.Zero, PaymentMethodAdditionalFeeExclTax = decimal.Zero, TaxRates = "0:0;", OrderTax = decimal.Zero, OrderTotal = 1855M, RefundedAmount = decimal.Zero, OrderDiscount = decimal.Zero, CheckoutAttributeDescription = string.Empty, CheckoutAttributesXml = string.Empty, CustomerCurrencyCode = "USD", CurrencyRate = 1M, AffiliateId = 0, OrderStatus = OrderStatus.Processing, AllowStoringCreditCardNumber = false, CardType = string.Empty, CardName = string.Empty, CardNumber = string.Empty, MaskedCreditCardNumber = string.Empty, CardCvv2 = string.Empty, CardExpirationMonth = string.Empty, CardExpirationYear = string.Empty, PaymentMethodSystemName = "Payments.CheckMoneyOrder", AuthorizationTransactionId = string.Empty, AuthorizationTransactionCode = string.Empty, AuthorizationTransactionResult = string.Empty, CaptureTransactionId = string.Empty, CaptureTransactionResult = string.Empty, SubscriptionTransactionId = string.Empty, PaymentStatus = PaymentStatus.Paid, PaidDateUtc = DateTime.UtcNow, BillingAddress = (Address)firstCustomer.BillingAddress.Clone(), ShippingAddress = (Address)firstCustomer.ShippingAddress.Clone(), ShippingStatus = ShippingStatus.NotYetShipped, ShippingMethod = "Ground", PickUpInStore = false, ShippingRateComputationMethodSystemName = "Shipping.FixedRate", CustomValuesXml = string.Empty, VatNumber = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _orderRepository.Insert(firstOrder); //item Apple iCam var firstOrderItem1 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = firstOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Apple iCam")).Id, UnitPriceInclTax = 1300M, UnitPriceExclTax = 1300M, PriceInclTax = 1300M, PriceExclTax = 1300M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(firstOrderItem1); //item Leica T Mirrorless Digital Camera var fierstOrderItem2 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = firstOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Leica T Mirrorless Digital Camera")).Id, UnitPriceInclTax = 530M, UnitPriceExclTax = 530M, PriceInclTax = 530M, PriceExclTax = 530M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(fierstOrderItem2); //item $25 Virtual Gift Card var firstOrderItem3 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = firstOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("$25 Virtual Gift Card")).Id, UnitPriceInclTax = 25M, UnitPriceExclTax = 25M, PriceInclTax = 25M, PriceExclTax = 25M, OriginalProductCost = decimal.Zero, AttributeDescription = "From: Steve Gates <[email protected]><br />For: Brenda Lindgren <[email protected]>", AttributesXml = "<Attributes><GiftCardInfo><RecipientName>Brenda Lindgren</RecipientName><RecipientEmail>[email protected]</RecipientEmail><SenderName>Steve Gates</SenderName><SenderEmail>[email protected]</SenderEmail><Message></Message></GiftCardInfo></Attributes>", Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(firstOrderItem3); var firstOrderGiftcard = new GiftCard { GiftCardType = GiftCardType.Virtual, PurchasedWithOrderItem = firstOrderItem3, Amount = 25M, IsGiftCardActivated = false, GiftCardCouponCode = string.Empty, RecipientName = "Brenda Lindgren", RecipientEmail = "*****@*****.**", SenderName = "Steve Gates", SenderEmail = "*****@*****.**", Message = string.Empty, IsRecipientNotified = false, CreatedOnUtc = DateTime.UtcNow }; _giftCardRepository.Insert(firstOrderGiftcard); //order notes _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order placed", Order = firstOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order paid", Order = firstOrder }); //second order var secondCustomer = _customerRepository.Table.First(c => c.Email.Equals("*****@*****.**")); var secondOrder = new Order() { StoreId = defaultStore.Id, OrderGuid = Guid.NewGuid(), Customer = secondCustomer, CustomerLanguageId = _languageRepository.Table.First().Id, CustomerIp = "127.0.0.1", OrderSubtotalInclTax = 2460M, OrderSubtotalExclTax = 2460M, OrderSubTotalDiscountInclTax = decimal.Zero, OrderSubTotalDiscountExclTax = decimal.Zero, OrderShippingInclTax = decimal.Zero, OrderShippingExclTax = decimal.Zero, PaymentMethodAdditionalFeeInclTax = decimal.Zero, PaymentMethodAdditionalFeeExclTax = decimal.Zero, TaxRates = "0:0;", OrderTax = decimal.Zero, OrderTotal = 2460M, RefundedAmount = decimal.Zero, OrderDiscount = decimal.Zero, CheckoutAttributeDescription = string.Empty, CheckoutAttributesXml = string.Empty, CustomerCurrencyCode = "USD", CurrencyRate = 1M, AffiliateId = 0, OrderStatus = OrderStatus.Pending, AllowStoringCreditCardNumber = false, CardType = string.Empty, CardName = string.Empty, CardNumber = string.Empty, MaskedCreditCardNumber = string.Empty, CardCvv2 = string.Empty, CardExpirationMonth = string.Empty, CardExpirationYear = string.Empty, PaymentMethodSystemName = "Payments.CheckMoneyOrder", AuthorizationTransactionId = string.Empty, AuthorizationTransactionCode = string.Empty, AuthorizationTransactionResult = string.Empty, CaptureTransactionId = string.Empty, CaptureTransactionResult = string.Empty, SubscriptionTransactionId = string.Empty, PaymentStatus = PaymentStatus.Pending, PaidDateUtc = null, BillingAddress = (Address)secondCustomer.BillingAddress.Clone(), ShippingAddress = (Address)secondCustomer.ShippingAddress.Clone(), ShippingStatus = ShippingStatus.NotYetShipped, ShippingMethod = "Next Day Air", PickUpInStore = false, ShippingRateComputationMethodSystemName = "Shipping.FixedRate", CustomValuesXml = string.Empty, VatNumber = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _orderRepository.Insert(secondOrder); //order notes _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order placed", Order = secondOrder }); //item Vintage Style Engagement Ring var secondOrderItem1 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = secondOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Vintage Style Engagement Ring")).Id, UnitPriceInclTax = 2100M, UnitPriceExclTax = 2100M, PriceInclTax = 2100M, PriceExclTax = 2100M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(secondOrderItem1); //item Flower Girl Bracelet var secondOrderItem2 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = secondOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Flower Girl Bracelet")).Id, UnitPriceInclTax = 360M, UnitPriceExclTax = 360M, PriceInclTax = 360M, PriceExclTax = 360M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(secondOrderItem2); //third order var thirdCustomer = _customerRepository.Table.First(c => c.Email.Equals("*****@*****.**")); var thirdOrder = new Order() { StoreId = defaultStore.Id, OrderGuid = Guid.NewGuid(), Customer = thirdCustomer, CustomerLanguageId = _languageRepository.Table.First().Id, CustomerIp = "127.0.0.1", OrderSubtotalInclTax = 8.80M, OrderSubtotalExclTax = 8.80M, OrderSubTotalDiscountInclTax = decimal.Zero, OrderSubTotalDiscountExclTax = decimal.Zero, OrderShippingInclTax = decimal.Zero, OrderShippingExclTax = decimal.Zero, PaymentMethodAdditionalFeeInclTax = decimal.Zero, PaymentMethodAdditionalFeeExclTax = decimal.Zero, TaxRates = "0:0;", OrderTax = decimal.Zero, OrderTotal = 8.80M, RefundedAmount = decimal.Zero, OrderDiscount = decimal.Zero, CheckoutAttributeDescription = string.Empty, CheckoutAttributesXml = string.Empty, CustomerCurrencyCode = "USD", CurrencyRate = 1M, AffiliateId = 0, OrderStatus = OrderStatus.Pending, AllowStoringCreditCardNumber = false, CardType = string.Empty, CardName = string.Empty, CardNumber = string.Empty, MaskedCreditCardNumber = string.Empty, CardCvv2 = string.Empty, CardExpirationMonth = string.Empty, CardExpirationYear = string.Empty, PaymentMethodSystemName = "Payments.CheckMoneyOrder", AuthorizationTransactionId = string.Empty, AuthorizationTransactionCode = string.Empty, AuthorizationTransactionResult = string.Empty, CaptureTransactionId = string.Empty, CaptureTransactionResult = string.Empty, SubscriptionTransactionId = string.Empty, PaymentStatus = PaymentStatus.Pending, PaidDateUtc = null, BillingAddress = (Address)thirdCustomer.BillingAddress.Clone(), ShippingAddress = null, ShippingStatus = ShippingStatus.ShippingNotRequired, ShippingMethod = string.Empty, PickUpInStore = false, ShippingRateComputationMethodSystemName = string.Empty, CustomValuesXml = string.Empty, VatNumber = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _orderRepository.Insert(thirdOrder); //order notes _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order placed", Order = thirdOrder }); //item If You Wait var thirdOrderItem1 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = thirdOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("If You Wait (donation)")).Id, UnitPriceInclTax = 3M, UnitPriceExclTax = 3M, PriceInclTax = 3M, PriceExclTax = 3M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(thirdOrderItem1); //item Night Visions var thirdOrderItem2 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = thirdOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Night Visions")).Id, UnitPriceInclTax = 2.8M, UnitPriceExclTax = 2.8M, PriceInclTax = 2.8M, PriceExclTax = 2.8M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(thirdOrderItem2); //item Science & Faith var thirdOrderItem3 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = thirdOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Science & Faith")).Id, UnitPriceInclTax = 3M, UnitPriceExclTax = 3M, PriceInclTax = 3M, PriceExclTax = 3M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(thirdOrderItem3); //fourth order var fourthCustomer = _customerRepository.Table.First(c => c.Email.Equals("*****@*****.**")); var fourthOrder = new Order() { StoreId = defaultStore.Id, OrderGuid = Guid.NewGuid(), Customer = fourthCustomer, CustomerLanguageId = _languageRepository.Table.First().Id, CustomerIp = "127.0.0.1", OrderSubtotalInclTax = 102M, OrderSubtotalExclTax = 102M, OrderSubTotalDiscountInclTax = decimal.Zero, OrderSubTotalDiscountExclTax = decimal.Zero, OrderShippingInclTax = decimal.Zero, OrderShippingExclTax = decimal.Zero, PaymentMethodAdditionalFeeInclTax = decimal.Zero, PaymentMethodAdditionalFeeExclTax = decimal.Zero, TaxRates = "0:0;", OrderTax = decimal.Zero, OrderTotal = 102M, RefundedAmount = decimal.Zero, OrderDiscount = decimal.Zero, CheckoutAttributeDescription = string.Empty, CheckoutAttributesXml = string.Empty, CustomerCurrencyCode = "USD", CurrencyRate = 1M, AffiliateId = 0, OrderStatus = OrderStatus.Processing, AllowStoringCreditCardNumber = false, CardType = string.Empty, CardName = string.Empty, CardNumber = string.Empty, MaskedCreditCardNumber = string.Empty, CardCvv2 = string.Empty, CardExpirationMonth = string.Empty, CardExpirationYear = string.Empty, PaymentMethodSystemName = "Payments.CheckMoneyOrder", AuthorizationTransactionId = string.Empty, AuthorizationTransactionCode = string.Empty, AuthorizationTransactionResult = string.Empty, CaptureTransactionId = string.Empty, CaptureTransactionResult = string.Empty, SubscriptionTransactionId = string.Empty, PaymentStatus = PaymentStatus.Paid, PaidDateUtc = DateTime.UtcNow, BillingAddress = (Address)fourthCustomer.BillingAddress.Clone(), ShippingAddress = (Address)fourthCustomer.ShippingAddress.Clone(), ShippingStatus = ShippingStatus.Shipped, ShippingMethod = "Pickup in store", PickUpInStore = true, PickupAddress = (Address)fourthCustomer.ShippingAddress.Clone(), ShippingRateComputationMethodSystemName = "Pickup.PickupInStore", CustomValuesXml = string.Empty, VatNumber = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _orderRepository.Insert(fourthOrder); //order notes _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order placed", Order = fourthOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order paid", Order = fourthOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order shipped", Order = fourthOrder }); //item Pride and Prejudice var fourthOrderItem1 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = fourthOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Pride and Prejudice")).Id, UnitPriceInclTax = 24M, UnitPriceExclTax = 24M, PriceInclTax = 24M, PriceExclTax = 24M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(fourthOrderItem1); //item First Prize Pies var fourthOrderItem2 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = fourthOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("First Prize Pies")).Id, UnitPriceInclTax = 51M, UnitPriceExclTax = 51M, PriceInclTax = 51M, PriceExclTax = 51M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(fourthOrderItem2); //item Fahrenheit 451 by Ray Bradbury var fourthOrderItem3 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = fourthOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Fahrenheit 451 by Ray Bradbury")).Id, UnitPriceInclTax = 27M, UnitPriceExclTax = 27M, PriceInclTax = 27M, PriceExclTax = 27M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(fourthOrderItem3); //shipments //shipment 1 var fourthOrderShipment1 = new Shipment { Order = fourthOrder, TrackingNumber = string.Empty, TotalWeight = 4M, ShippedDateUtc = DateTime.UtcNow, DeliveryDateUtc = DateTime.UtcNow, AdminComment = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _shipmentRepository.Insert(fourthOrderShipment1); var fourthOrderShipment1Item1 = new ShipmentItem() { OrderItemId = fourthOrderItem1.Id, Quantity = 1, WarehouseId = 0, Shipment = fourthOrderShipment1 }; _shipmentItemRepository.Insert(fourthOrderShipment1Item1); var fourthOrderShipment1Item2 = new ShipmentItem() { OrderItemId = fourthOrderItem2.Id, Quantity = 1, WarehouseId = 0, Shipment = fourthOrderShipment1 }; _shipmentItemRepository.Insert(fourthOrderShipment1Item2); //shipment 2 var fourthOrderShipment2 = new Shipment { Order = fourthOrder, TrackingNumber = string.Empty, TotalWeight = 2M, ShippedDateUtc = DateTime.UtcNow, DeliveryDateUtc = DateTime.UtcNow, AdminComment = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _shipmentRepository.Insert(fourthOrderShipment2); var fourthOrderShipment2Item1 = new ShipmentItem() { OrderItemId = fourthOrderItem3.Id, Quantity = 1, WarehouseId = 0, Shipment = fourthOrderShipment2 }; _shipmentItemRepository.Insert(fourthOrderShipment2Item1); //fifth order var fifthCustomer = _customerRepository.Table.First(c => c.Email.Equals("*****@*****.**")); var fifthOrder = new Order() { StoreId = defaultStore.Id, OrderGuid = Guid.NewGuid(), Customer = fifthCustomer, CustomerLanguageId = _languageRepository.Table.First().Id, CustomerIp = "127.0.0.1", OrderSubtotalInclTax = 43.50M, OrderSubtotalExclTax = 43.50M, OrderSubTotalDiscountInclTax = decimal.Zero, OrderSubTotalDiscountExclTax = decimal.Zero, OrderShippingInclTax = decimal.Zero, OrderShippingExclTax = decimal.Zero, PaymentMethodAdditionalFeeInclTax = decimal.Zero, PaymentMethodAdditionalFeeExclTax = decimal.Zero, TaxRates = "0:0;", OrderTax = decimal.Zero, OrderTotal = 43.50M, RefundedAmount = decimal.Zero, OrderDiscount = decimal.Zero, CheckoutAttributeDescription = string.Empty, CheckoutAttributesXml = string.Empty, CustomerCurrencyCode = "USD", CurrencyRate = 1M, AffiliateId = 0, OrderStatus = OrderStatus.Complete, AllowStoringCreditCardNumber = false, CardType = string.Empty, CardName = string.Empty, CardNumber = string.Empty, MaskedCreditCardNumber = string.Empty, CardCvv2 = string.Empty, CardExpirationMonth = string.Empty, CardExpirationYear = string.Empty, PaymentMethodSystemName = "Payments.CheckMoneyOrder", AuthorizationTransactionId = string.Empty, AuthorizationTransactionCode = string.Empty, AuthorizationTransactionResult = string.Empty, CaptureTransactionId = string.Empty, CaptureTransactionResult = string.Empty, SubscriptionTransactionId = string.Empty, PaymentStatus = PaymentStatus.Paid, PaidDateUtc = DateTime.UtcNow, BillingAddress = (Address)fifthCustomer.BillingAddress.Clone(), ShippingAddress = (Address)fifthCustomer.ShippingAddress.Clone(), ShippingStatus = ShippingStatus.Delivered, ShippingMethod = "Ground", PickUpInStore = false, ShippingRateComputationMethodSystemName = "Shipping.FixedRate", CustomValuesXml = string.Empty, VatNumber = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _orderRepository.Insert(fifthOrder); //order notes _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order placed", Order = fifthOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order paid", Order = fifthOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order shipped", Order = fifthOrder }); _orderNoteRepository.Insert(new OrderNote() { CreatedOnUtc = DateTime.UtcNow, Note = "Order delivered", Order = fifthOrder }); //item Levi's 511 Jeans var fifthOrderItem1 = new OrderItem() { OrderItemGuid = Guid.NewGuid(), Order = fifthOrder, ProductId = _productRepository.Table.First(p => p.Name.Equals("Levi's 511 Jeans")).Id, UnitPriceInclTax = 43.50M, UnitPriceExclTax = 43.50M, PriceInclTax = 43.50M, PriceExclTax = 43.50M, OriginalProductCost = decimal.Zero, AttributeDescription = string.Empty, AttributesXml = string.Empty, Quantity = 1, DiscountAmountInclTax = decimal.Zero, DiscountAmountExclTax = decimal.Zero, DownloadCount = 0, IsDownloadActivated = false, LicenseDownloadId = 0, ItemWeight = null, RentalStartDateUtc = null, RentalEndDateUtc = null }; _orderItemRepository.Insert(fifthOrderItem1); //shipment 1 var fifthOrderShipment1 = new Shipment { Order = fifthOrder, TrackingNumber = string.Empty, TotalWeight = 2M, ShippedDateUtc = DateTime.UtcNow, DeliveryDateUtc = DateTime.UtcNow, AdminComment = string.Empty, CreatedOnUtc = DateTime.UtcNow }; _shipmentRepository.Insert(fifthOrderShipment1); var fifthOrderShipment1Item1 = new ShipmentItem() { OrderItemId = fifthOrderItem1.Id, Quantity = 1, WarehouseId = 0, Shipment = fifthOrderShipment1 }; _shipmentItemRepository.Insert(fifthOrderShipment1Item1); }