private async Task MapAddressElement(XmlDocument xml, OrderCloudAPI api, string shiptoID)
        {
            var xpath = "cXML/Request/PunchOutSetupRequest/ShipTo";

            if (shiptoID == null)
            {
                xml.SelectSingleNode("cXML/Request/PunchOutSetupRequest").RemoveChild(xml.SelectSingleNode(xpath));
                return;
            }

            var address = await api.GetUserAddress(shiptoID);

            xml.SelectSingleNode($"{xpath}/Address/@addressID").InnerText               = address.ID;
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/@name").InnerText      = address.AddressName;
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/DeliverTo").InnerText  = $"{address.FirstName} {address.LastName}";
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/Street").InnerText     = $"{address.Street1} {address.Street2}";
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/State").InnerText      = address.State;
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/PostalCode").InnerText = address.Zip;
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/Country/@isoCountryCode").InnerText = address.Country;
            xml.SelectSingleNode($"{xpath}/Address/PostalAddress/Country").InnerText = address.Country;
        }
Пример #2
0
        public async Task ProcessOrderSubmit(string bearerToken, string orderID, string buyerID)
        {
            var addresses = new Dictionary <string, OrderCloudAddress>();
            var api       = new OrderCloudAPI(bearerToken);
            var order     = await api.GetOrder(buyerID, orderID);

            Util.Log(order.ToString());
            var lineItemList = await api.ListLineItems(buyerID, orderID);

            Func <string, Task <OrderCloudAddress> > GetCachedAddress = async(id) =>
            {
                if (id == null || id == "")
                {
                    return(null);
                }

                if (addresses.ContainsKey(id))
                {
                    return(addresses[id]);
                }
                else
                {
                    var address = await api.GetUserAddress(id);

                    addresses.Add(id, address);
                    return(address);
                }
            };

            //it's possible there will be line items from different punchout cofigs on this order
            var groups = lineItemList.Items.Where(x => x.xp != null && x.xp.PunchoutName != null).GroupBy(x => x.xp.PunchoutName, (key, group) => new GroupedItemList {
                PunchoutName = key, Items = group
            }).GetEnumerator();
            var billingAddress = await GetCachedAddress(order.BillingAddressID);

            while (groups.MoveNext())
            {
                var lineItemGroup = groups.Current;
                var config        = Util.GetPunchoutConfig(lineItemGroup.PunchoutName);
                var xml           = new XmlDocument();
                var orderTotal    = (decimal)0.00;

                xml.LoadXml(Util.ReadEmbeddedResource(config.OrderRequestTemplateResource));
                var itemTemplate = xml.SelectSingleNode("cXML/Request/OrderRequest/ItemOut").Clone();
                xml.SelectSingleNode("cXML/Request/OrderRequest").RemoveChild(xml.SelectSingleNode("cXML/Request/OrderRequest/ItemOut"));
                if (billingAddress != null)
                {
                    SetAddress(xml.SelectSingleNode("cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress"), billingAddress);
                }

                for (var i = 0; i < lineItemGroup.Items.Count(); i++)
                {
                    var item    = lineItemGroup.Items.ElementAt(i);
                    var address = await GetCachedAddress(item.ShippingAddressID);

                    if (address != null)
                    {
                        SetAddress(itemTemplate.SelectSingleNode("ShipTo/Address/PostalAddress"), address);
                    }

                    itemTemplate.SelectSingleNode("@quantity").InnerText                      = item.Quantity.ToString();
                    itemTemplate.SelectSingleNode("@lineNumber").InnerText                    = i + 1.ToString();
                    itemTemplate.SelectSingleNode("ItemID/SupplierPartID").InnerText          = item.xp.SupplierPartID;
                    itemTemplate.SelectSingleNode("ItemID/SupplierPartAuxiliaryID").InnerText = item.xp.SupplierPartAuxiliaryID;
                    itemTemplate.SelectSingleNode("ItemDetail/Description").InnerText         = item.xp.Description;
                    itemTemplate.SelectSingleNode("ItemDetail/UnitPrice/Money").InnerText     = item.UnitPrice.ToString("0.00");
                    xml.SelectSingleNode("cXML/Request/OrderRequest").AppendChild(itemTemplate.Clone());
                    orderTotal += (item.UnitPrice * item.Quantity);
                }
                config.OrderRequestMappings.First(x => x.Name == "OrderID").Value    = orderID;
                config.OrderRequestMappings.First(x => x.Name == "OrderTotal").Value = Math.Round(orderTotal, 2).ToString("0.00");
                Util.ReplaceTemplateValues(xml, config.OrderRequestMappings);
                Util.ReplaceTemplateValues(xml, config.HeaderMappings);

                Util.Log(xml.OuterXml);
                var response = await config.OrderRequestUrl.PostStringAsync(xml.OuterXml).ReceiveString();

                Util.Log(response);
            }
        }