Ejemplo n.º 1
0
        /// <summary>
        /// Updates an order in the ERP.
        /// </summary>
        /// <param name="order">The order that must be synced with the ERP.</param>
        /// <param name="liveIntegrationSubmitType">Determines the origin of this submit such.</param>
        /// <param name="successOrderStateId">The order state that is applied to the order when it integrates successfully.</param>
        /// <param name="failedOrderStateId">The order state that is applied to the order when an error occurred during the integration.</param>
        /// <returns>Returns null if no communication has made, or bool if order has been updated successfully or not.</returns>
        public static bool?UpdateOrder(Order order, LiveIntegrationSubmitType liveIntegrationSubmitType, string successOrderStateId = null, string failedOrderStateId = null)
        {
            if (order == null || !order.OrderLines.Any())
            {
                return(null);
            }
            if (liveIntegrationSubmitType == LiveIntegrationSubmitType.LiveOrderOrCart && !string.IsNullOrEmpty(order.IntegrationOrderId))
            {
                return(null);
            }

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

            Logger.Instance.Log(ErrorLevel.DebugInfo, string.Format("Updating order with ID: {0}. Complete: {1}. Order submitted from the backend: {2}. Stack trace: {3}", orderId, order.Complete, ExecutingContext.IsBackEnd(), Environment.StackTrace));

            // use current user if is not backend running or if the cart is Anonymous
            var user = (order.CustomerAccessUserId > 0 ? User.GetUserByID(order.CustomerAccessUserId) : null)
                       ?? (!ExecutingContext.IsBackEnd() ? User.GetCurrentExtranetUser() : null);

            // customization for VanBaerle branch: ERP doesn't support anonymous users and throws errors
            if (user == null)
            {
                return(null);
            }

            /* create order: if it is false, you will get a calculate order from the ERP with the total prices */
            /* if it is true, then a new order will be created in the ERP */
            bool createOrder = order.Complete;

            if (createOrder && user != null)
            {
                UserSync(user);
            }

            if (!Settings.Instance.EnableCartCommunicationForAnonymousUsers && user == null)
            {
                Logger.Instance.Log(ErrorLevel.DebugInfo, string.Format("No user is currently logged in. Anonymous user cart is not allowed. Order = {0}", orderId));
                return(null);
            }

            // default states
            if (successOrderStateId == null)
            {
                successOrderStateId = Settings.Instance.OrderStateAfterExportSucceeded;
            }
            if (failedOrderStateId == null)
            {
                failedOrderStateId = Settings.Instance.OrderStateAfterExportFailed;
            }

            var requestXml = new OrderXmlRenderer().RenderOrderXml(order, new RenderOrderSettings {
                AddOrderLineFieldsToRequest = AddOrderLineFieldsToRequest, AddOrderFieldsToRequest = AddOrderFieldsToRequest, CreateOrder = createOrder, LiveIntegrationSubmitType = liveIntegrationSubmitType, ReferenceName = "OrdersPut"
            });

            if (createOrder && SaveOrderXml && liveIntegrationSubmitType == LiveIntegrationSubmitType.LiveOrderOrCart)
            {
                SaveCopyOfXml(order.Id, requestXml);
            }

            // calculate current hash
            string currentHash = CalculateHash(requestXml);

            // get last hash
            string lastHash = GetLastOrderHash();

            if (!string.IsNullOrEmpty(lastHash) && lastHash == currentHash)
            {
                // no changes to order
                return(null);
            }
            // save this hash for next calls
            SaveOrderHash(currentHash);

            // clear all session var to avoid miss calculations
            HttpContext.Current.Session.Remove("LiveIntegrationDiscounts" + order.Id);

            Dictionary <string, XmlDocument> responsesCache = ErpResponseCache.GetWebOrdersConnectorResponses(OrderCacheLevel);

            XmlDocument response = null;

            if (!createOrder && responsesCache.ContainsKey(requestXml))
            {
                response = responsesCache[requestXml];
            }
            else
            {
                if (createOrder)
                {
                    OrderDebuggingInfo.Save(order, "Sending order to the ERP system through Live Integration.", "OrderHandler");
                }
                try
                {
                    response = Connector.CalculateOrder(requestXml, order.Id, createOrder);
                }
                catch (LiveIntegrationException ex)
                {
                    // TODO Rui, handle appropriately
                    Logger.Instance.Log(ErrorLevel.ConnectionError, ex.Message);
                }
                if (responsesCache.ContainsKey(requestXml))
                {
                    responsesCache.Remove(requestXml);
                }
                if (!string.IsNullOrWhiteSpace(response?.InnerXml))
                {
                    responsesCache.Add(requestXml, response);
                }
            }
            if (!string.IsNullOrWhiteSpace(response?.InnerXml))
            {
                bool processResponseResult = ProcessResponse(response, order, createOrder, successOrderStateId, failedOrderStateId);

                // new user sync active, sync user (Update)
                if (Settings.Instance.UpdateUserAfterNewOrder && user != null)
                {
                    user.SynchronizeUsingLiveIntegration(true, UserSyncMode.Get);
                }

                return(processResponseResult);
            }
            else
            {
                //error occurred
                CheckIfOrderShouldRevertToCart(order, createOrder);
                return(false);
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Occurs when the button was clicked from edit order page. Gets the XML for the order and returns it to the browser.
 /// </summary>        
 private void CreateCurrentXml(object sender, EventArgs e)
 {
     var order = (Order)Ribbon.DataContext.DataSource;
     var xml = new OrderXmlRenderer().RenderOrderXml(order, new RenderOrderSettings { AddOrderFieldsToRequest = true, AddOrderLineFieldsToRequest = true, CreateOrder = true, Beautify = true, LiveIntegrationSubmitType = LiveIntegrationSubmitType.DownloadedFromBackend, ReferenceName = "OrdersPut" });
     StreamFile(xml, string.Format("Order_{0}.xml", order.Id));
 }