/// <summary> /// Deletes a shipment /// </summary> /// <param name="shipment">Shipment</param> public virtual void DeleteShipment(Shipment shipment) { if (shipment == null) throw new ArgumentNullException("shipment"); _shipmentRepository.Delete(shipment); //event notification _eventPublisher.EntityDeleted(shipment); }
public void Can_save_and_load_shipment() { var shipment = new Shipment { Order = GetTestOrder(), TrackingNumber = "TrackingNumber 1", ShippedDateUtc = new DateTime(2010, 01, 01), DeliveryDateUtc = new DateTime(2010, 01, 02), }; var fromDb = SaveAndLoadEntity(shipment); fromDb.ShouldNotBeNull(); fromDb.TrackingNumber.ShouldEqual("TrackingNumber 1"); fromDb.ShippedDateUtc.ShouldEqual(new DateTime(2010, 01, 01)); fromDb.DeliveryDateUtc.ShouldEqual(new DateTime(2010, 01, 02)); }
public void Can_save_and_load_shipment() { var shipment = new Shipment { Order = GetTestOrder(), TrackingNumber = "TrackingNumber 1", TotalWeight = 9.87M, ShippedDateUtc = new DateTime(2010, 01, 01), DeliveryDateUtc = new DateTime(2010, 01, 02), AdminComment = "AdminComment 1", CreatedOnUtc = new DateTime(2010, 01, 03), }; var fromDb = SaveAndLoadEntity(shipment); fromDb.ShouldNotBeNull(); fromDb.TrackingNumber.ShouldEqual("TrackingNumber 1"); fromDb.TotalWeight.ShouldEqual(9.87M); fromDb.ShippedDateUtc.ShouldEqual(new DateTime(2010, 01, 01)); fromDb.DeliveryDateUtc.ShouldEqual(new DateTime(2010, 01, 02)); fromDb.AdminComment.ShouldEqual("AdminComment 1"); fromDb.CreatedOnUtc.ShouldEqual(new DateTime(2010, 01, 03)); }
public void Can_save_and_load_shipment_with_products() { var shipment = new Shipment { Order = GetTestOrder(), TrackingNumber = "TrackingNumber 1", ShippedDateUtc = new DateTime(2010, 01, 01), DeliveryDateUtc = new DateTime(2010, 01, 02), }; shipment.ShipmentOrderProductVariants.Add(new ShipmentOrderProductVariant() { OrderProductVariantId = 1, Quantity = 2, }); var fromDb = SaveAndLoadEntity(shipment); fromDb.ShouldNotBeNull(); fromDb.ShipmentOrderProductVariants.ShouldNotBeNull(); (fromDb.ShipmentOrderProductVariants.Count == 1).ShouldBeTrue(); fromDb.ShipmentOrderProductVariants.First().Quantity.ShouldEqual(2); }
public virtual void AddShipmentTokens(IList<Token> tokens, Shipment shipment, int languageId) { tokens.Add(new Token("Shipment.ShipmentNumber", shipment.Id.ToString())); tokens.Add(new Token("Shipment.TrackingNumber", shipment.TrackingNumber)); tokens.Add(new Token("Shipment.Product(s)", ProductListToHtmlTable(shipment, languageId), true)); tokens.Add(new Token("Shipment.URLForCustomer", string.Format("{0}orderdetails/shipment/{1}", GetStoreUrl(shipment.Order.StoreId), shipment.Id), true)); //event notification _eventPublisher.EntityTokensAdded(shipment, tokens); }
/// <summary> /// Sends an SMS notification when order is shipped. /// Configuration is obtained from Configuration->Settings->SMS /// </summary> /// <param name="shipment"></param> public virtual void SendOrderShippedSMSNotification(Order order, Shipment ship) { string text = String.Format(_smsSettings.MessageTemplate, ship.TrackingNumber); _smsSender.SendSMS(_smsSettings.From, order.ShippingAddress.PhoneNumber, text); }
/// <summary> /// Sends a shipment sent notification to a customer /// </summary> /// <param name="shipment">Shipment</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendShipmentSentCustomerNotification(Shipment shipment, int languageId) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = shipment.Order; if (order == null) throw new Exception("Order cannot be loaded"); languageId = EnsureLanguageIsActive(languageId); var messageTemplate = GetLocalizedActiveMessageTemplate("ShipmentSent.CustomerNotification", languageId); if (messageTemplate == null) return 0; var shipmentTokens = GenerateTokens(shipment, languageId); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, shipmentTokens); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = order.BillingAddress.Email; var toName = string.Format("{0} {1}", order.BillingAddress.FirstName, order.BillingAddress.LastName); return SendNotification(messageTemplate, emailAccount, languageId, shipmentTokens, toEmail, toName); }
/// <summary> /// Send a shipment /// </summary> /// <param name="shipment">Shipment</param> /// <param name="notifyCustomer">True to notify customer</param> public virtual void Ship(Shipment shipment, bool notifyCustomer) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = _orderService.GetOrderById(shipment.OrderId); if (order == null) throw new Exception("Order cannot be loaded"); if (shipment.ShippedDateUtc.HasValue) throw new Exception("This shipment is already shipped"); shipment.ShippedDateUtc = DateTime.UtcNow; _shipmentService.UpdateShipment(shipment); //process products with "Multiple warehouse" support enabled foreach (var item in shipment.ShipmentItems) { var orderItem = _orderService.GetOrderItemById(item.OrderItemId); _productService.BookReservedInventory(orderItem.Product, item.WarehouseId, -item.Quantity); } //check whether we have more items to ship if (order.HasItemsToAddToShipment() || order.HasItemsToShip()) order.ShippingStatusId = (int)ShippingStatus.PartiallyShipped; else order.ShippingStatusId = (int)ShippingStatus.Shipped; _orderService.UpdateOrder(order); //add a note order.OrderNotes.Add(new OrderNote { Note = string.Format("Shipment# {0} has been sent", shipment.Id), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); if (notifyCustomer) { //notify customer int queuedEmailId = _workflowMessageService.SendShipmentSentCustomerNotification(shipment, order.CustomerLanguageId); if (queuedEmailId > 0) { order.OrderNotes.Add(new OrderNote { Note = string.Format("\"Shipped\" email (to customer) has been queued. Queued email identifier: {0}.", queuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } } //event _eventPublisher.PublishShipmentSent(shipment); //check order status CheckOrderStatus(order); }
protected ShipmentModel PrepareShipmentModel(Shipment shipment, bool prepareProducts) { //measures var baseWeight = _measureService.GetMeasureWeightById(_measureSettings.BaseWeightId); var baseWeightIn = baseWeight != null ? baseWeight.Name : ""; var baseDimension = _measureService.GetMeasureDimensionById(_measureSettings.BaseDimensionId); var baseDimensionIn = baseDimension != null ? baseDimension.Name : ""; var model = new ShipmentModel() { Id = shipment.Id, OrderId = shipment.OrderId, TrackingNumber = shipment.TrackingNumber, TotalWeight = shipment.TotalWeight.HasValue ? string.Format("{0:F2} [{1}]", shipment.TotalWeight, baseWeightIn) : "", ShippedDate = shipment.ShippedDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.ShippedDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.ShippedDate.NotYet"), CanShip = !shipment.ShippedDateUtc.HasValue, DeliveryDate = shipment.DeliveryDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.DeliveryDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.DeliveryDate.NotYet"), CanDeliver = shipment.ShippedDateUtc.HasValue && !shipment.DeliveryDateUtc.HasValue, DisplayPdfPackagingSlip = _pdfSettings.Enabled, }; if (prepareProducts) { foreach (var sopv in shipment.ShipmentOrderProductVariants) { var opv = _orderService.GetOrderProductVariantById(sopv.OrderProductVariantId); if (opv == null) continue; //quantities var qtyInThisShipment = sopv.Quantity; var maxQtyToAdd = opv.GetTotalNumberOfItemsCanBeAddedToShipment(); var qtyOrdered = opv.Quantity; var qtyInAllShipments = opv.GetTotalNumberOfItemsInAllShipment(); var sopvModel = new ShipmentModel.ShipmentOrderProductVariantModel() { Id = sopv.Id, OrderProductVariantId = opv.Id, ProductVariantId = opv.ProductVariantId, Sku = opv.ProductVariant.Sku, AttributeInfo = opv.AttributeDescription, ItemWeight = opv.ItemWeight.HasValue ? string.Format("{0:F2} [{1}]", opv.ItemWeight, baseWeightIn) : "", ItemDimensions = string.Format("{0:F2} x {1:F2} x {2:F2} [{3}]", opv.ProductVariant.Length, opv.ProductVariant.Width, opv.ProductVariant.Height, baseDimensionIn), QuantityOrdered = qtyOrdered, QuantityInThisShipment = qtyInThisShipment, QuantityInAllShipments = qtyInAllShipments, QuantityToAdd = maxQtyToAdd, }; //product name if (!String.IsNullOrEmpty(opv.ProductVariant.Name)) sopvModel.FullProductName = string.Format("{0} ({1})", opv.ProductVariant.Product.Name, opv.ProductVariant.Name); else sopvModel.FullProductName = opv.ProductVariant.Product.Name; model.Products.Add(sopvModel); } } return model; }
/// <summary> /// Sends a shipment delivered notification to a customer /// </summary> /// <param name="shipment">Shipment</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendShipmentDeliveredCustomerNotification(Shipment shipment, int languageId) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = shipment.Order; if (order == null) throw new Exception("Order cannot be loaded"); var store = _storeService.GetStoreById(order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetActiveMessageTemplate("ShipmentDelivered.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.AddShipmentTokens(tokens, shipment, languageId); _messageTokenProvider.AddOrderTokens(tokens, shipment.Order, languageId); _messageTokenProvider.AddCustomerTokens(tokens, shipment.Order.Customer); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var toEmail = order.BillingAddress.Email; var toName = string.Format("{0} {1}", order.BillingAddress.FirstName, order.BillingAddress.LastName); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public virtual void AddShipmentTokens(IList<Token> tokens, Shipment shipment, int languageId) { tokens.Add(new Token("Shipment.ShipmentNumber", shipment.Id.ToString())); tokens.Add(new Token("Shipment.TrackingNumber", shipment.TrackingNumber)); var trackingNumberUrl = ""; if (!String.IsNullOrEmpty(shipment.TrackingNumber)) { //we cannot inject IShippingService into constructor because it'll cause circular references. //that's why we resolve it here this way var shippingService = EngineContext.Current.Resolve<IShippingService>(); var srcm = shippingService.LoadShippingRateComputationMethodBySystemName(shipment.Order.ShippingRateComputationMethodSystemName); if (srcm != null && srcm.PluginDescriptor.Installed && srcm.IsShippingRateComputationMethodActive(_shippingSettings)) { var shipmentTracker = srcm.ShipmentTracker; if (shipmentTracker != null) { trackingNumberUrl = shipmentTracker.GetUrl(shipment.TrackingNumber); } } } tokens.Add(new Token("Shipment.TrackingNumberURL", trackingNumberUrl, true)); tokens.Add(new Token("Shipment.Product(s)", ProductListToHtmlTable(shipment, languageId), true)); tokens.Add(new Token("Shipment.URLForCustomer", string.Format("{0}orderdetails/shipment/{1}", GetStoreUrl(shipment.Order.StoreId), shipment.Id), true)); //event notification _eventPublisher.EntityTokensAdded(shipment, tokens); }
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); }
protected virtual ShipmentDetailsModel PrepareShipmentDetailsModel(Shipment shipment) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = _orderService.GetOrderById(shipment.OrderId); if (order == null) throw new Exception("order cannot be loaded"); var model = new ShipmentDetailsModel(); model.Id = shipment.Id; if (shipment.ShippedDateUtc.HasValue) model.ShippedDate = _dateTimeHelper.ConvertToUserTime(shipment.ShippedDateUtc.Value, DateTimeKind.Utc); if (shipment.DeliveryDateUtc.HasValue) model.DeliveryDate = _dateTimeHelper.ConvertToUserTime(shipment.DeliveryDateUtc.Value, DateTimeKind.Utc); //tracking number and shipment information if (!String.IsNullOrEmpty(shipment.TrackingNumber)) { model.TrackingNumber = shipment.TrackingNumber; var srcm = _shippingService.LoadShippingRateComputationMethodBySystemName(order.ShippingRateComputationMethodSystemName); if (srcm != null && srcm.PluginDescriptor.Installed && srcm.IsShippingRateComputationMethodActive(_shippingSettings)) { var shipmentTracker = srcm.ShipmentTracker; if (shipmentTracker != null) { model.TrackingNumberUrl = shipmentTracker.GetUrl(shipment.TrackingNumber); if (_shippingSettings.DisplayShipmentEventsToCustomers) { var shipmentEvents = shipmentTracker.GetShipmentEvents(shipment.TrackingNumber); if (shipmentEvents != null) { foreach (var shipmentEvent in shipmentEvents) { var shipmentStatusEventModel = new ShipmentDetailsModel.ShipmentStatusEventModel(); var shipmentEventCountry = _countryService.GetCountryByTwoLetterIsoCode(shipmentEvent.CountryCode); shipmentStatusEventModel.Country = shipmentEventCountry != null ? shipmentEventCountry.GetLocalized(x => x.Name) : shipmentEvent.CountryCode; shipmentStatusEventModel.Date = shipmentEvent.Date; shipmentStatusEventModel.EventName = shipmentEvent.EventName; shipmentStatusEventModel.Location = shipmentEvent.Location; model.ShipmentStatusEvents.Add(shipmentStatusEventModel); } } } } } } //products in this shipment model.ShowSku = _catalogSettings.ShowProductSku; foreach (var shipmentItem in shipment.ShipmentItems) { var orderItem = order.OrderItems.Where(x => x.Id == shipmentItem.OrderItemId).FirstOrDefault(); // _orderService.GetOrderItemById(shipmentItem.OrderItemId); if (orderItem == null) continue; var shipmentItemModel = new ShipmentDetailsModel.ShipmentItemModel { Id = shipmentItem.Id, Sku = orderItem.Product.FormatSku(orderItem.AttributesXml, _productAttributeParser), ProductId = orderItem.Product.Id, ProductName = orderItem.Product.GetLocalized(x => x.Name), ProductSeName = orderItem.Product.GetSeName(), AttributeInfo = orderItem.AttributeDescription, QuantityOrdered = orderItem.Quantity, QuantityShipped = shipmentItem.Quantity, }; //rental info if (orderItem.Product.IsRental) { var rentalStartDate = orderItem.RentalStartDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalStartDateUtc.Value) : ""; var rentalEndDate = orderItem.RentalEndDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalEndDateUtc.Value) : ""; shipmentItemModel.RentalInfo = string.Format(_localizationService.GetResource("Order.Rental.FormattedDate"), rentalStartDate, rentalEndDate); } model.Items.Add(shipmentItemModel); } //order details model model.Order = PrepareOrderDetailsModel(order); return model; }
protected virtual ShipmentModel PrepareShipmentModel(Shipment shipment, bool prepareProducts, bool prepareShipmentEvent = false) { //measures var baseWeight = _measureService.GetMeasureWeightById(_measureSettings.BaseWeightId); var baseWeightIn = baseWeight != null ? baseWeight.Name : ""; var baseDimension = _measureService.GetMeasureDimensionById(_measureSettings.BaseDimensionId); var baseDimensionIn = baseDimension != null ? baseDimension.Name : ""; var model = new ShipmentModel { Id = shipment.ID, OrderId = shipment.OrderId, TrackingNumber = shipment.TrackingNumber, TotalWeight = shipment.TotalWeight.HasValue ? string.Format("{0:F2} [{1}]", shipment.TotalWeight, baseWeightIn) : "", ShippedDate = shipment.ShippedDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.ShippedDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.ShippedDate.NotYet"), ShippedDateUtc = shipment.ShippedDateUtc, CanShip = !shipment.ShippedDateUtc.HasValue, DeliveryDate = shipment.DeliveryDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.DeliveryDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.DeliveryDate.NotYet"), DeliveryDateUtc = shipment.DeliveryDateUtc, CanDeliver = shipment.ShippedDateUtc.HasValue && !shipment.DeliveryDateUtc.HasValue, AdminComment = shipment.AdminComment, }; if (prepareProducts) { foreach (var shipmentItem in shipment.ShipmentItems) { var orderItem = _orderService.GetOrderItemById(shipmentItem.OrderItemId); if (orderItem == null) continue; //quantities var qtyInThisShipment = shipmentItem.Quantity; var maxQtyToAdd = orderItem.GetTotalNumberOfItemsCanBeAddedToShipment(); var qtyOrdered = orderItem.Quantity; var qtyInAllShipments = orderItem.GetTotalNumberOfItemsInAllShipment(); var warehouse = _shippingService.GetWarehouseById(shipmentItem.WarehouseId); var shipmentItemModel = new ShipmentModel.ShipmentItemModel { Id = shipmentItem.ID, OrderItemId = orderItem.ID, ProductId = orderItem.ProductId, ProductName = orderItem.Product.Name, Sku = orderItem.Product.FormatSku(orderItem.AttributesXml, _productAttributeParser), AttributeInfo = orderItem.AttributeDescription, ShippedFromWarehouse = warehouse != null ? warehouse.Name : null, ShipSeparately = orderItem.Product.ShipSeparately, ItemWeight = orderItem.ItemWeight.HasValue ? string.Format("{0:F2} [{1}]", orderItem.ItemWeight, baseWeightIn) : "", ItemDimensions = string.Format("{0:F2} x {1:F2} x {2:F2} [{3}]", orderItem.Product.Length, orderItem.Product.Width, orderItem.Product.Height, baseDimensionIn), QuantityOrdered = qtyOrdered, QuantityInThisShipment = qtyInThisShipment, QuantityInAllShipments = qtyInAllShipments, QuantityToAdd = maxQtyToAdd, }; //rental info if (orderItem.Product.IsRental) { var rentalStartDate = orderItem.RentalStartDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalStartDateUtc.Value) : ""; var rentalEndDate = orderItem.RentalEndDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalEndDateUtc.Value) : ""; shipmentItemModel.RentalInfo = string.Format(_localizationService.GetResource("Order.Rental.FormattedDate"), rentalStartDate, rentalEndDate); } model.Items.Add(shipmentItemModel); } } if (prepareShipmentEvent && !String.IsNullOrEmpty(shipment.TrackingNumber)) { var order = shipment.Order; var srcm = _shippingService.LoadShippingRateComputationMethodBySystemName(order.ShippingRateComputationMethodSystemName); if (srcm != null && srcm.PluginDescriptor.Installed && srcm.IsShippingRateComputationMethodActive(_shippingSettings)) { var shipmentTracker = srcm.ShipmentTracker; if (shipmentTracker != null) { model.TrackingNumberUrl = shipmentTracker.GetUrl(shipment.TrackingNumber); if (_shippingSettings.DisplayShipmentEventsToStoreOwner) { var shipmentEvents = shipmentTracker.GetShipmentEvents(shipment.TrackingNumber); if (shipmentEvents != null) { foreach (var shipmentEvent in shipmentEvents) { var shipmentStatusEventModel = new ShipmentModel.ShipmentStatusEventModel(); var shipmentEventCountry = _countryService.GetCountryByTwoLetterIsoCode(shipmentEvent.CountryCode); shipmentStatusEventModel.Country = shipmentEventCountry != null ? shipmentEventCountry.GetLocalized(x => x.Name) : shipmentEvent.CountryCode; shipmentStatusEventModel.Date = shipmentEvent.Date; shipmentStatusEventModel.EventName = shipmentEvent.EventName; shipmentStatusEventModel.Location = shipmentEvent.Location; model.ShipmentStatusEvents.Add(shipmentStatusEventModel); } } } } } } return model; }
public ActionResult AddShipment(int orderId, FormCollection form, bool continueEditing) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); var order = _orderService.GetOrderById(orderId); if (order == null) //No order found with the specified id return RedirectToAction("List"); //a vendor should have access only to his products if (_workContext.CurrentVendor != null && !HasAccessToOrder(order)) return RedirectToAction("List"); var orderItems = order.OrderItems; //a vendor should have access only to his products if (_workContext.CurrentVendor != null) { orderItems = orderItems.Where(HasAccessToOrderItem).ToList(); } Shipment shipment = null; decimal? totalWeight = null; foreach (var orderItem in orderItems) { //is shippable if (!orderItem.Product.IsShipEnabled) continue; //ensure that this product can be shipped (have at least one item to ship) var maxQtyToAdd = orderItem.GetTotalNumberOfItemsCanBeAddedToShipment(); if (maxQtyToAdd <= 0) continue; int qtyToAdd = 0; //parse quantity foreach (string formKey in form.AllKeys) if (formKey.Equals(string.Format("qtyToAdd{0}", orderItem.ID), StringComparison.InvariantCultureIgnoreCase)) { int.TryParse(form[formKey], out qtyToAdd); break; } int warehouseId = 0; if (orderItem.Product.ManageInventoryMethod == ManageInventoryMethod.ManageStock && orderItem.Product.UseMultipleWarehouses) { //multiple warehouses supported //warehouse is chosen by a store owner foreach (string formKey in form.AllKeys) if (formKey.Equals(string.Format("warehouse_{0}", orderItem.ID), StringComparison.InvariantCultureIgnoreCase)) { int.TryParse(form[formKey], out warehouseId); break; } } else { //multiple warehouses are not supported warehouseId = orderItem.Product.WarehouseId; } foreach (string formKey in form.AllKeys) if (formKey.Equals(string.Format("qtyToAdd{0}", orderItem.ID), StringComparison.InvariantCultureIgnoreCase)) { int.TryParse(form[formKey], out qtyToAdd); break; } //validate quantity if (qtyToAdd <= 0) continue; if (qtyToAdd > maxQtyToAdd) qtyToAdd = maxQtyToAdd; //ok. we have at least one item. let's create a shipment (if it does not exist) var orderItemTotalWeight = orderItem.ItemWeight.HasValue ? orderItem.ItemWeight * qtyToAdd : null; if (orderItemTotalWeight.HasValue) { if (!totalWeight.HasValue) totalWeight = 0; totalWeight += orderItemTotalWeight.Value; } if (shipment == null) { var trackingNumber = form["TrackingNumber"]; var adminComment = form["AdminComment"]; shipment = new Shipment { OrderId = order.ID, TrackingNumber = trackingNumber, TotalWeight = null, ShippedDateUtc = null, DeliveryDateUtc = null, AdminComment = adminComment, CreatedOnUtc = DateTime.UtcNow, }; } //create a shipment item var shipmentItem = new ShipmentItem { OrderItemId = orderItem.ID, Quantity = qtyToAdd, WarehouseId = warehouseId }; shipment.ShipmentItems.Add(shipmentItem); } //if we have at least one item in the shipment, then save it if (shipment != null && shipment.ShipmentItems.Count > 0) { shipment.TotalWeight = totalWeight; _shipmentService.InsertShipment(shipment); SuccessNotification(_localizationService.GetResource("Admin.Orders.Shipments.Added")); return continueEditing ? RedirectToAction("ShipmentDetails", new {id = shipment.ID}) : RedirectToAction("Edit", new { id = orderId }); } ErrorNotification(_localizationService.GetResource("Admin.Orders.Shipments.NoProductsSelected")); return RedirectToAction("AddShipment", new { orderId = orderId }); }
/// <summary> /// Publishes the shipment sent event. /// </summary> /// <param name="eventPublisher">The event publisher.</param> /// <param name="shipment">The shipment.</param> public static void PublishShipmentSent(this IEventPublisher eventPublisher, Shipment shipment) { eventPublisher.Publish(new ShipmentSentEvent(shipment)); }
/// <summary> /// Convert a collection to a HTML table /// </summary> /// <param name="shipment">Shipment</param> /// <param name="languageId">Language identifier</param> /// <returns>HTML table of products</returns> protected virtual string ProductListToHtmlTable(Shipment shipment, int languageId) { string result; var sb = new StringBuilder(); sb.AppendLine("<table border=\"0\" style=\"width:100%;\">"); #region Products sb.AppendLine(string.Format("<tr style=\"background-color:{0};text-align:center;\">", _templatesSettings.Color1)); sb.AppendLine(string.Format("<th>{0}</th>", _localizationService.GetResource("Messages.Order.Product(s).Name", languageId))); sb.AppendLine(string.Format("<th>{0}</th>", _localizationService.GetResource("Messages.Order.Product(s).Quantity", languageId))); sb.AppendLine("</tr>"); var table = shipment.ShipmentItems.ToList(); for (int i = 0; i <= table.Count - 1; i++) { var si = table[i]; var orderItem = _orderService.GetOrderItemById(si.OrderItemId); if (orderItem == null) continue; var product = orderItem.Product; if (product == null) continue; sb.AppendLine(string.Format("<tr style=\"background-color: {0};text-align: center;\">", _templatesSettings.Color2)); //product name string productName = product.GetLocalized(x => x.Name, languageId); sb.AppendLine("<td style=\"padding: 0.6em 0.4em;text-align: left;\">" + HttpUtility.HtmlEncode(productName)); //attributes if (!String.IsNullOrEmpty(orderItem.AttributeDescription)) { sb.AppendLine("<br />"); sb.AppendLine(orderItem.AttributeDescription); } //rental info if (orderItem.Product.IsRental) { var rentalStartDate = orderItem.RentalStartDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalStartDateUtc.Value) : ""; var rentalEndDate = orderItem.RentalEndDateUtc.HasValue ? orderItem.Product.FormatRentalDate(orderItem.RentalEndDateUtc.Value) : ""; var rentalInfo = string.Format(_localizationService.GetResource("Order.Rental.FormattedDate"), rentalStartDate, rentalEndDate); sb.AppendLine("<br />"); sb.AppendLine(rentalInfo); } //sku if (_catalogSettings.ShowProductSku) { var sku = product.FormatSku(orderItem.AttributesXml, _productAttributeParser); if (!String.IsNullOrEmpty(sku)) { sb.AppendLine("<br />"); sb.AppendLine(string.Format(_localizationService.GetResource("Messages.Order.Product(s).SKU", languageId), HttpUtility.HtmlEncode(sku))); } } sb.AppendLine("</td>"); sb.AppendLine(string.Format("<td style=\"padding: 0.6em 0.4em;text-align: center;\">{0}</td>", si.Quantity)); sb.AppendLine("</tr>"); } #endregion sb.AppendLine("</table>"); result = sb.ToString(); return result; }
/// <summary> /// Publishes the shipment delivered event. /// </summary> /// <param name="eventPublisher">The event publisher.</param> /// <param name="shipment">The shipment.</param> public static void PublishShipmentDelivered(this IEventPublisher eventPublisher, Shipment shipment) { eventPublisher.Publish(new ShipmentDeliveredEvent(shipment)); }
/// <summary> /// Send a shipment /// </summary> /// <param name="shipment">Shipment</param> /// <param name="notifyCustomer">True to notify customer</param> public virtual void Ship(Shipment shipment, bool notifyCustomer) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = _orderService.GetOrderById(shipment.OrderId); if (order == null) throw new Exception("Order cannot be loaded"); if (shipment.ShippedDateUtc.HasValue) throw new Exception("This shipment is already shipped"); shipment.ShippedDateUtc = DateTime.UtcNow; _shipmentService.UpdateShipment(shipment); //check whether we have more items to ship if (order.HasItemsToAddToShipment() || order.HasItemsToShip()) order.ShippingStatusId = (int)ShippingStatus.PartiallyShipped; else order.ShippingStatusId = (int)ShippingStatus.Shipped; _orderService.UpdateOrder(order); //add a note order.OrderNotes.Add(new OrderNote() { Note = string.Format("Shipment# {0} has been sent", shipment.Id), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); if (notifyCustomer) { //notify customer int queuedEmailId = _workflowMessageService.SendShipmentSentCustomerNotification(shipment, order.CustomerLanguageId); if (queuedEmailId > 0) { order.OrderNotes.Add(new OrderNote() { Note = string.Format("\"Shipped\" email (to customer) has been queued. Queued email identifier: {0}.", queuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } _workflowMessageService.SendOrderShippedSMSNotification(order, shipment); order.OrderNotes.Add(new OrderNote() { Note = string.Format("SMS was sent.", queuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } //event _eventPublisher.PublishShipmentSent(shipment); //check order status CheckOrderStatus(order); }
protected bool HasAccessToShipment(Shipment shipment) { if (shipment == null) throw new ArgumentNullException("shipment"); if (_workContext.CurrentVendor == null) //not a vendor; has access return true; var hasVendorProducts = false; var vendorId = _workContext.CurrentVendor.Id; foreach (var shipmentItem in shipment.ShipmentItems) { var orderItem = _orderService.GetOrderItemById(shipmentItem.OrderItemId); if (orderItem != null) { if (orderItem.Product.VendorId == vendorId) { hasVendorProducts = true; break; } } } return hasVendorProducts; }
protected ShipmentDetailsModel PrepareShipmentDetailsModel(Shipment shipment) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = shipment.Order; if (order == null) throw new Exception("order cannot be loaded"); var model = new ShipmentDetailsModel(); model.Id = shipment.Id; if (shipment.ShippedDateUtc.HasValue) model.ShippedDate = _dateTimeHelper.ConvertToUserTime(shipment.ShippedDateUtc.Value, DateTimeKind.Utc); if (shipment.DeliveryDateUtc.HasValue) model.DeliveryDate = _dateTimeHelper.ConvertToUserTime(shipment.DeliveryDateUtc.Value, DateTimeKind.Utc); //tracking number and shipment information model.TrackingNumber = shipment.TrackingNumber; var srcm = _shippingService.LoadShippingRateComputationMethodBySystemName(order.ShippingRateComputationMethodSystemName); if (srcm != null && srcm.PluginDescriptor.Installed && srcm.IsShippingRateComputationMethodActive(_shippingSettings)) { var shipmentTracker = srcm.ShipmentTracker; if (shipmentTracker != null) { model.TrackingNumberUrl = shipmentTracker.GetUrl(shipment.TrackingNumber); if (_shippingSettings.DisplayShipmentEventsToCustomers) { var shipmentEvents = shipmentTracker.GetShipmentEvents(shipment.TrackingNumber); if (shipmentEvents != null) foreach (var shipmentEvent in shipmentEvents) { var shipmentStatusEventModel = new ShipmentDetailsModel.ShipmentStatusEventModel(); var shipmentEventCountry = _countryService.GetCountryByTwoLetterIsoCode(shipmentEvent.CountryCode); shipmentStatusEventModel.Country = shipmentEventCountry != null ? shipmentEventCountry.GetLocalized(x => x.Name) : shipmentEvent.CountryCode; shipmentStatusEventModel.Date = shipmentEvent.Date; shipmentStatusEventModel.EventName = shipmentEvent.EventName; shipmentStatusEventModel.Location = shipmentEvent.Location; model.ShipmentStatusEvents.Add(shipmentStatusEventModel); } } } } //products in this shipment model.ShowSku = _catalogSettings.ShowProductSku; foreach (var sopv in shipment.ShipmentOrderProductVariants) { var opv = _orderService.GetOrderProductVariantById(sopv.OrderProductVariantId); if (opv == null) continue; var sopvModel = new ShipmentDetailsModel.ShipmentOrderProductVariantModel() { Id = sopv.Id, Sku = opv.ProductVariant.FormatSku(opv.AttributesXml, _productAttributeParser), ProductId = opv.ProductVariant.ProductId, ProductSeName = opv.ProductVariant.Product.GetSeName(), AttributeInfo = opv.AttributeDescription, QuantityOrdered = opv.Quantity, QuantityShipped = sopv.Quantity, }; //product name//product name if (!String.IsNullOrEmpty(opv.ProductVariant.GetLocalized(x => x.Name))) sopvModel.ProductName = string.Format("{0} ({1})", opv.ProductVariant.Product.GetLocalized(x => x.Name), opv.ProductVariant.GetLocalized(x => x.Name)); else sopvModel.ProductName = opv.ProductVariant.Product.GetLocalized(x => x.Name); model.Items.Add(sopvModel); } //order details model model.Order = PrepareOrderDetailsModel(order); return model; }
protected ShipmentModel PrepareShipmentModel(Shipment shipment, bool prepareProducts) { //measures var baseWeight = _measureService.GetMeasureWeightById(_measureSettings.BaseWeightId); var baseWeightIn = baseWeight != null ? baseWeight.Name : ""; var baseDimension = _measureService.GetMeasureDimensionById(_measureSettings.BaseDimensionId); var baseDimensionIn = baseDimension != null ? baseDimension.Name : ""; var model = new ShipmentModel() { Id = shipment.Id, OrderId = shipment.OrderId, TrackingNumber = shipment.TrackingNumber, TotalWeight = shipment.TotalWeight.HasValue ? string.Format("{0:F2} [{1}]", shipment.TotalWeight, baseWeightIn) : "", ShippedDate = shipment.ShippedDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.ShippedDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.ShippedDate.NotYet"), ShippedDateUtc = shipment.ShippedDateUtc, CanShip = !shipment.ShippedDateUtc.HasValue, DeliveryDate = shipment.DeliveryDateUtc.HasValue ? _dateTimeHelper.ConvertToUserTime(shipment.DeliveryDateUtc.Value, DateTimeKind.Utc).ToString() : _localizationService.GetResource("Admin.Orders.Shipments.DeliveryDate.NotYet"), DeliveryDateUtc = shipment.DeliveryDateUtc, CanDeliver = shipment.ShippedDateUtc.HasValue && !shipment.DeliveryDateUtc.HasValue, }; if (prepareProducts) { foreach (var shipmentItem in shipment.ShipmentItems) { var orderItem = _orderService.GetOrderItemById(shipmentItem.OrderItemId); if (orderItem == null) continue; //quantities var qtyInThisShipment = shipmentItem.Quantity; var maxQtyToAdd = orderItem.GetTotalNumberOfItemsCanBeAddedToShipment(); var qtyOrdered = orderItem.Quantity; var qtyInAllShipments = orderItem.GetTotalNumberOfItemsInAllShipment(); var shipmentItemModel = new ShipmentModel.ShipmentItemModel() { Id = shipmentItem.Id, OrderItemId = orderItem.Id, ProductId = orderItem.ProductId, ProductName = orderItem.Product.Name, Sku = orderItem.Product.FormatSku(orderItem.AttributesXml, _productAttributeParser), AttributeInfo = orderItem.AttributeDescription, ItemWeight = orderItem.ItemWeight.HasValue ? string.Format("{0:F2} [{1}]", orderItem.ItemWeight, baseWeightIn) : "", ItemDimensions = string.Format("{0:F2} x {1:F2} x {2:F2} [{3}]", orderItem.Product.Length, orderItem.Product.Width, orderItem.Product.Height, baseDimensionIn), QuantityOrdered = qtyOrdered, QuantityInThisShipment = qtyInThisShipment, QuantityInAllShipments = qtyInAllShipments, QuantityToAdd = maxQtyToAdd, }; model.Items.Add(shipmentItemModel); } } return model; }
public ActionResult AddShipment(int orderId, FormCollection form, bool continueEditing) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) return AccessDeniedView(); var order = _orderService.GetOrderById(orderId); if (order == null) //No order found with the specified id return RedirectToAction("List"); Shipment shipment = null; decimal? totalWeight = null; foreach (var opv in order.OrderProductVariants) { //is shippable if (!opv.ProductVariant.IsShipEnabled) continue; //ensure that this product variant can be shipped (have at least one item to ship) var maxQtyToAdd = opv.GetTotalNumberOfItemsCanBeAddedToShipment(); if (maxQtyToAdd <= 0) continue; int qtyToAdd = 0; //parse quantity foreach (string formKey in form.AllKeys) if (formKey.Equals(string.Format("qtyToAdd{0}", opv.Id), StringComparison.InvariantCultureIgnoreCase)) { int.TryParse(form[formKey], out qtyToAdd); break; } //validate quantity if (qtyToAdd <= 0) continue; if (qtyToAdd > maxQtyToAdd) qtyToAdd = maxQtyToAdd; //ok. we have at least one item. let's create a shipment (if it does not exist) var opvTotalWeight = opv.ItemWeight.HasValue ? opv.ItemWeight * qtyToAdd : null; if (opvTotalWeight.HasValue) { if (!totalWeight.HasValue) totalWeight = 0; totalWeight += opvTotalWeight.Value; } if (shipment == null) { shipment = new Shipment() { OrderId = order.Id, TrackingNumber = form["TrackingNumber"], TotalWeight = null, ShippedDateUtc = null, DeliveryDateUtc = null, CreatedOnUtc = DateTime.UtcNow, }; } //create a shipment order product variant var sopv = new ShipmentOrderProductVariant() { OrderProductVariantId = opv.Id, Quantity = qtyToAdd, }; shipment.ShipmentOrderProductVariants.Add(sopv); } //if we have at least one item in the shipment, then save it if (shipment != null && shipment.ShipmentOrderProductVariants.Count > 0) { shipment.TotalWeight = totalWeight; _shipmentService.InsertShipment(shipment); SuccessNotification(_localizationService.GetResource("Admin.Orders.Shipments.Added")); return continueEditing ? RedirectToAction("ShipmentDetails", new {id = shipment.Id}) : RedirectToAction("Edit", new { id = orderId }); } else { ErrorNotification(_localizationService.GetResource("Admin.Orders.Shipments.NoProductsSelected")); return RedirectToAction("AddShipment", new { orderId = orderId }); } }
public virtual void AddShipmentTokens(IList<Token> tokens, Shipment shipment, int languageId) { tokens.Add(new Token("Shipment.ShipmentNumber", shipment.Id.ToString())); tokens.Add(new Token("Shipment.Product(s)", ProductListToHtmlTable(shipment, languageId), true)); tokens.Add(new Token("Shipment.URLForCustomer", string.Format("{0}orderdetails/shipment/{1}", _webHelper.GetStoreLocation(false), shipment.Id), true)); }
/// <summary> /// Marks a shipment as delivered /// </summary> /// <param name="shipment">Shipment</param> /// <param name="notifyCustomer">True to notify customer</param> public virtual void Deliver(Shipment shipment, bool notifyCustomer) { if (shipment == null) throw new ArgumentNullException("shipment"); var order = shipment.Order; if (order == null) throw new Exception("Order cannot be loaded"); if (!shipment.ShippedDateUtc.HasValue) throw new Exception("This shipment is not shipped yet"); if (shipment.DeliveryDateUtc.HasValue) throw new Exception("This shipment is already delivered"); shipment.DeliveryDateUtc = DateTime.UtcNow; _shipmentService.UpdateShipment(shipment); if (!order.HasItemsToAddToShipment() && !order.HasItemsToShip() && !order.HasItemsToDeliver()) order.ShippingStatusId = (int)ShippingStatus.Delivered; _orderService.UpdateOrder(order); //add a note order.OrderNotes.Add(new OrderNote { Note = string.Format("Shipment# {0} has been delivered", shipment.Id), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); if (notifyCustomer) { //send email notification int queuedEmailId = _workflowMessageService.SendShipmentDeliveredCustomerNotification(shipment, order.CustomerLanguageId); if (queuedEmailId > 0) { order.OrderNotes.Add(new OrderNote { Note = string.Format("\"Delivered\" email (to customer) has been queued. Queued email identifier: {0}.", queuedEmailId), DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } } //event _eventPublisher.PublishShipmentDelivered(shipment); //check order status CheckOrderStatus(order); }
/// <summary> /// Convert a collection to a HTML table /// </summary> /// <param name="shipment">Shipment</param> /// <param name="languageId">Language identifier</param> /// <returns>HTML table of products</returns> protected virtual string ProductListToHtmlTable(Shipment shipment, int languageId) { var result = ""; var language = _languageService.GetLanguageById(languageId); var sb = new StringBuilder(); sb.AppendLine("<table border=\"0\" style=\"width:100%;\">"); #region Products sb.AppendLine(string.Format("<tr style=\"background-color:{0};text-align:center;\">", _templatesSettings.Color1)); sb.AppendLine(string.Format("<th>{0}</th>", _localizationService.GetResource("Messages.Order.Product(s).Name", languageId))); sb.AppendLine(string.Format("<th>{0}</th>", _localizationService.GetResource("Messages.Order.Product(s).Quantity", languageId))); sb.AppendLine("</tr>"); var table = shipment.ShipmentOrderProductVariants.ToList(); for (int i = 0; i <= table.Count - 1; i++) { var sopv = table[i]; var opv = _orderService.GetOrderProductVariantById(sopv.OrderProductVariantId); if (opv == null) continue; var productVariant = opv.ProductVariant; if (productVariant == null) continue; sb.AppendLine(string.Format("<tr style=\"background-color: {0};text-align: center;\">", _templatesSettings.Color2)); //product name string productName = ""; //product name if (!String.IsNullOrEmpty(opv.ProductVariant.GetLocalized(x => x.Name, languageId))) productName = string.Format("{0} ({1})", opv.ProductVariant.Product.GetLocalized(x => x.Name, languageId), opv.ProductVariant.GetLocalized(x => x.Name, languageId)); else productName = opv.ProductVariant.Product.GetLocalized(x => x.Name, languageId); sb.AppendLine("<td style=\"padding: 0.6em 0.4em;text-align: left;\">" + HttpUtility.HtmlEncode(productName)); //attributes if (!String.IsNullOrEmpty(opv.AttributeDescription)) { sb.AppendLine("<br />"); sb.AppendLine(opv.AttributeDescription); } //sku if (_catalogSettings.ShowProductSku) { if (!String.IsNullOrEmpty(opv.ProductVariant.Sku)) { sb.AppendLine("<br />"); string sku = string.Format(_localizationService.GetResource("Messages.Order.Product(s).SKU", languageId), HttpUtility.HtmlEncode(opv.ProductVariant.Sku)); sb.AppendLine(sku); } } sb.AppendLine("</td>"); sb.AppendLine(string.Format("<td style=\"padding: 0.6em 0.4em;text-align: center;\">{0}</td>", sopv.Quantity)); sb.AppendLine("</tr>"); } #endregion sb.AppendLine("</table>"); result = sb.ToString(); return result; }
private IList<Token> GenerateTokens(Shipment shipment, int languageId) { var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens); _messageTokenProvider.AddShipmentTokens(tokens, shipment, languageId); _messageTokenProvider.AddOrderTokens(tokens, shipment.Order, languageId); _messageTokenProvider.AddCustomerTokens(tokens, shipment.Order.Customer); return tokens; }
public void AddSelectedShipment(int orderId) { //if (!_permissionService.Authorize(StandardPermissionProvider.ManageOrders)) // return AccessDeniedView(); var order = _orderService.GetOrderById(orderId); //model.CanAddNewShipments = order.HasItemsToAddToShipment(); //if (order == null) // //No order found with the specified id // return RedirectToAction("List"); //a vendor should have access only to his products //if (_workContext.CurrentVendor != null && !HasAccessToOrder(order)) // return RedirectToAction("List"); bool blnAddToShipment = false; blnAddToShipment = order.HasItemsToAddToShipment(); if (order.HasItemsToAddToShipment()) { var orderItems = order.OrderItems; //a vendor should have access only to his products if (_workContext.CurrentVendor != null) { orderItems = orderItems.Where(HasAccessToOrderItem).ToList(); } Shipment shipment = null; decimal? totalWeight = null; foreach (var orderItem in orderItems) { //is shippable if (!orderItem.Product.IsShipEnabled) continue; //ensure that this product can be shipped (have at least one item to ship) var maxQtyToAdd = orderItem.GetTotalNumberOfItemsCanBeAddedToShipment(); if (maxQtyToAdd <= 0) continue; int qtyToAdd = 0; //parse quantity qtyToAdd = orderItem.Quantity; //foreach (string formKey in form.AllKeys) // if (formKey.Equals(string.Format("qtyToAdd{0}", orderItem.Id), StringComparison.InvariantCultureIgnoreCase)) // { // int.TryParse(form[formKey], out qtyToAdd); // break; // } int warehouseId = 0; if (orderItem.Product.ManageInventoryMethod == ManageInventoryMethod.ManageStock && orderItem.Product.UseMultipleWarehouses) { //multiple warehouses supported //warehouse is chosen by a store owner //foreach (string formKey in form.AllKeys) // if (formKey.Equals(string.Format("warehouse_{0}", orderItem.Id), StringComparison.InvariantCultureIgnoreCase)) // { // int.TryParse(form[formKey], out warehouseId); // break; // } } else { //multiple warehouses are not supported warehouseId = orderItem.Product.WarehouseId; } //foreach (string formKey in form.AllKeys) // if (formKey.Equals(string.Format("qtyToAdd{0}", orderItem.Id), StringComparison.InvariantCultureIgnoreCase)) // { // int.TryParse(form[formKey], out qtyToAdd); // break; // } //validate quantity if (qtyToAdd <= 0) continue; if (qtyToAdd > maxQtyToAdd) qtyToAdd = maxQtyToAdd; //ok. we have at least one item. let's create a shipment (if it does not exist) var orderItemTotalWeight = orderItem.ItemWeight.HasValue ? orderItem.ItemWeight * qtyToAdd : null; if (orderItemTotalWeight.HasValue) { if (!totalWeight.HasValue) totalWeight = 0; totalWeight += orderItemTotalWeight.Value; } if (shipment == null) { var trackingNumber = ""; var adminComment = ""; shipment = new Shipment { OrderId = order.Id, TrackingNumber = trackingNumber, TotalWeight = null, ShippedDateUtc = null, DeliveryDateUtc = null, AdminComment = adminComment, CreatedOnUtc = DateTime.UtcNow, }; } //create a shipment item var shipmentItem = new ShipmentItem { OrderItemId = orderItem.Id, Quantity = qtyToAdd, WarehouseId = warehouseId }; shipment.ShipmentItems.Add(shipmentItem); } //if we have at least one item in the shipment, then save it if (shipment != null && shipment.ShipmentItems.Count > 0) { shipment.TotalWeight = totalWeight; _shipmentService.InsertShipment(shipment); //add a note order.OrderNotes.Add(new OrderNote { Note = "A shipment has been added", DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); _orderService.UpdateOrder(order); } } }