Example #1
0
 public Order()
 {
     CreatedOn  = DateTime.UtcNow;
     OrderLines = new OrderLineCollection();
     Courses    = new CourseCollection();
     Guests     = new GuestCollection();
 }
        private static void ProcessOrderLines(XmlDocument response, Order order, OrderLineCollection discountOrderLines)
        {
            Logger.Instance.Log(ErrorLevel.DebugInfo, "ProcessOrderLines..."); // TODO: removeee

            XmlNode orderNode    = response.SelectSingleNode("//item [@table='EcomOrders']");
            var     orderCreated = bool.Parse(orderNode.SelectSingleNode("column [@columnName='OrderCreated']").InnerText);

            XmlNodeList orderLinesNodes = response.SelectNodes("//item [@table='EcomOrderLines']");

            if (orderLinesNodes != null && orderLinesNodes.Count > 0)//Process OrderLines
            {
                List <string>    orderlineIDs = new List <string>();
                List <OrderLine> orderLines   = order.OrderLines.ToList();

                foreach (XmlNode orderLineNode in orderLinesNodes)
                {
                    XmlNode xnOrderLineType = orderLineNode.SelectSingleNode("column [@columnName='OrderLineType']");

                    if (xnOrderLineType == null)
                    {
                        xnOrderLineType = orderLineNode.SelectSingleNode("column [@columnName='OrderLineTypeId']");
                    }

                    string orderLineType = xnOrderLineType.InnerText;
                    if (orderLineType == "0" || string.IsNullOrWhiteSpace(orderLineType))
                    {
                        Logger.Instance.Log(ErrorLevel.DebugInfo, "ProcessOrderLines 0 type..."); // TODO: removeee

                        ProcessProductOrderLines(order, orderlineIDs, orderLines, orderLineNode, orderCreated);
                    }
                    if (orderLineType == "1" || orderLineType == "3")                                //1=order discount, 3=Product Discount
                    {
                        Logger.Instance.Log(ErrorLevel.DebugInfo, "ProcessOrderLines 1, 3 type..."); // TODO: removeee

                        ProcessDiscountOrderLines(order, discountOrderLines, orderLineNode, orderLineType, orderCreated);
                    }
                }

                // Remove deleted OrderLines
                for (int i = order.OrderLines.Count - 1; i >= 0; i--)
                {
                    var orderLine = order.OrderLines[i];
                    if (string.IsNullOrWhiteSpace(orderLine.Id))
                    {
                        continue;
                    }
                    if (orderLine.Type == "1" || orderLine.Type == "3") //1=order discount, 3=Product Discount
                    {
                        continue;
                    }
                    if (!orderlineIDs.Contains(orderLine.Id))
                    {
                        order.OrderLines.Remove(orderLine);
                        orderLine.Delete();
                    }
                }
            }
        }
Example #3
0
 public Order()
 {
     CreatedOn  = DateTime.UtcNow;
     OrderLines = new OrderLineCollection();
 }
        private static void ProcessDiscountOrderLines(Order order, OrderLineCollection discountOrderLines, XmlNode orderLineNode, string orderLineType, bool orderCreated)
        {
            Logger.Instance.Log(ErrorLevel.DebugInfo, "ProcessDiscountOrderLines..."); // TODO: removeee

            string orderLineId       = orderLineNode.SelectSingleNode("column [@columnName='OrderLineId']")?.InnerText;
            string orderLineParentId = orderLineNode.SelectSingleNode("column [@columnName='OrderLineParentLineID']")?.InnerText;

            try
            {
                //parent id
                //discount name
                //discount quantity
                //discount "price" with vat
                // discount "price without vat
                double?dAux;
                var    orderLine = new OrderLine
                {
                    Order       = order,
                    OrderId     = order.Id,
                    Modified    = DateTime.Now,
                    DiscountId  = (string.IsNullOrEmpty(orderLineId) ? orderLineParentId : orderLineId),
                    Quantity    = 1,
                    Type        = orderLineType,
                    ProductName = Settings.Instance.TextForDiscounts
                };

                double multiplier = 1;

                if (orderLineType == "3") //1=order discount, 3=Product Discount
                {
                    //string parentProductId = orderLineNode.SelectSingleNode("column [@columnName='OrderLineProductNumber']").InnerText;
                    //foreach (var prod  uctOrderLine in order.OrderLines)
                    //{
                    //  if (productOrderLine.ProductId == parentProductId)
                    //  {
                    //    orderLine.ParentLineId = productOrderLine.Id;
                    //  }
                    //}
                    string parentProductNumber = orderLineNode.SelectSingleNode("column [@columnName='OrderLineProductNumber']").InnerText;
                    foreach (var productOrderLine in order.OrderLines)
                    {
                        if (string.Equals(productOrderLine.ProductNumber, parentProductNumber, StringComparison.OrdinalIgnoreCase))
                        {
                            orderLine.ParentLineId = productOrderLine.Id;
                            //orderLine.ProductId = productOrderLine.ProductId;
                            //orderLine.ProductVariantId = productOrderLine.ProductVariantId;
                            //orderLine.ProductNumber = productOrderLine.ProductNumber;

                            // if the order is created in NAV, the price the comes back already has the multiplier in it
                            if (!orderCreated)
                            {
                                multiplier = productOrderLine.Product?.GetUnitPriceMultiplier() ?? 1;
                            }
                        }
                    }
                }

                dAux = ReadDouble(orderLineNode, "column [@columnName='OrderLineQuantity']");
                if (dAux.HasValue)
                {
                    orderLine.Quantity = dAux.Value;
                }

                double priceWithoutVAT = ReadDouble(orderLineNode, "column [@columnName='OrderLinePriceWithoutVAT']").Value *multiplier;
                double priceWithVAT    = ReadDouble(orderLineNode, "column [@columnName='OrderLinePriceWithVAT']").Value *multiplier;

                orderLine.UnitPrice.PriceWithoutVAT = -Math.Abs(priceWithoutVAT / Math.Max(1, orderLine.Quantity));
                orderLine.UnitPrice.PriceWithVAT    = -Math.Abs(priceWithVAT / Math.Max(1, orderLine.Quantity));

                orderLine.Price.PriceWithoutVAT = -Math.Abs(priceWithoutVAT);
                orderLine.Price.PriceWithVAT    = -Math.Abs(priceWithVAT);

                //orderLine.Price.PriceWithVAT =
                //    -Helpers.ParseDouble(
                //        orderLineNode.SelectSingleNode("column [@columnName='OrderLineUnitPriceWithVAT']").
                //            InnerText);

                discountOrderLines.Add(orderLine);
            }
            catch (Exception anyError)
            {
                Logger.Instance.Log(ErrorLevel.Error, string.Format("Error processing order line. Error: '{0}' OrderLineId = {1}.", anyError, orderLineId));
                throw;
            }
        }
        private static void HandleIntegrationFailure(Order order, string failedState, string orderId, OrderLineCollection discountOrderLines)
        {
            if (Global.EnableCartCommunication(order.Complete))
            {
                RemoveDiscounts(order);
                order.OrderLines.Add(discountOrderLines);
            }
            Logger.Instance.Log(ErrorLevel.Error, string.Format("Order with ID '{0}' was not created in the ERP system.", orderId));
            HttpContext.Current.Session["LiveIntegration.OrderExportFailed"] = true;
            HttpContext.Current.Session["LiveIntegration.FailedOrderId"]     = order.Id;

            if (!Settings.Instance.QueueOrdersToExport)
            {
                order.DowngradeToCart();
                Dynamicweb.Ecommerce.Common.Context.SetCart(order);
                order.CartV2StepIndex = --order.CartV2StepIndex;
                order.Complete        = false;
            }

            if (!string.IsNullOrWhiteSpace(failedState))
            {
                order.StateId = failedState;
            }

            order.Save();
        }
        private static bool ProcessResponse(XmlDocument response, Order order, bool createOrder, string successState, string failedState)
        {
            //        var orderParser = new OrderXmlParser(response);

            Logger.Instance.Log(ErrorLevel.DebugInfo, "Process response..."); // TODO: removeee


            var orderId = order == null ? "is null" : order.Id ?? "ID is null";

            if (response == null || order == null)
            {
                if (createOrder)
                {
                    // if must create order and no response or invalid order fail to sync
                    Logger.Instance.Log(ErrorLevel.Error, string.Format("Response CreateOrder is null. Order = {0}", orderId));
                    return(false);
                }

                // nothing to do so work done
                return(true);
            }

            try
            {
                XmlNode orderNode = response.SelectSingleNode("//item [@table='EcomOrders']");
                if (Global.EnableCartCommunication(order.Complete))
                {
                    // Set Order prices
                    //order.AllowOverridePrices = true;
                    try
                    {
                        //SetPrices(order, orderNode);

                        SetCustomerNumber(order, orderNode);
                    }
                    catch (Exception ex)
                    {
                        Logger.Instance.Log(ErrorLevel.Error, string.Format("Exception setting prices: {0} Order = {1}", ex.Message, orderId));
                    }
                }

                SetCustomOrderFields(order, orderNode);

                var discountOrderLines = new OrderLineCollection();

                if (Global.EnableCartCommunication(order.Complete))
                {
                    ProcessOrderLines(response, order, discountOrderLines);
                    //order.OrderLines.Add(discountOrderLines);
                }

                if (createOrder)
                {
                    AssignIntegrationOrderId(order, orderNode);
                    var orderCreatedSuccessfully = bool.Parse(orderNode.SelectSingleNode("column [@columnName='OrderCreated']").InnerText);
                    if (!orderCreatedSuccessfully)
                    {
                        HandleIntegrationFailure(order, failedState, orderId, discountOrderLines);
                    }
                    else
                    {
                        HandleIntegrationSuccess(order, successState);
                    }
                }
                //else
                //{
                //    order.Save();
                //}

                if (Global.EnableCartCommunication(order.Complete))
                {
                    //add discount orderlines to cache, to be added by the discountProvider
                    HttpContext.Current.Session["LiveIntegrationDiscounts" + order.Id] = discountOrderLines;
                }
            }
            catch (Exception e)
            {
                Logger.Instance.Log(ErrorLevel.Error, string.Format("Error processing response. Error: '{0}' Order = {1}.", e, orderId));
                return(false);
            }

            return(true);
        }