HomeGuidesAPI Reference
Submit Documentation FeedbackJoin Developer CommunityOptimizely GitHubOptimizely NuGetLog In

Extending the PunchOutOrderRequestParser

This topic describes how to extend the PunchOutOrderRequestParser.

PunchOut is a mechanism by which the e-procurement application makes it possible for a buyer to access a supplier's Web site from the buyer's own procurement application.

B2B Commerce integrates with PunchOut, but may require customization. The following sample code shows how to extend the PunchOutOrderRequestParser to accommodate additional fields.

The following extends the schema by storing the new field's temporary storage using HttpContext as an item collection. Dependency injection will detect the new plugin and use it automatically.

using System;
    using System.Linq;
    using System.Xml;
    using InSite.Model.PunchOut;
    using InSite.PunchOut.Interfaces;
    using InSite.PunchOut;
    using System.Web;
    using System.Text.RegularExpressions;
    using InSite.Model;
    
    namespace Custom.Infrastructure.Plugins
    {
      public class PunchOutOrderRequestParser_Custom : PunchOutOrderRequestParser
          {
            public PunchOutOrderRequestParser_Custom(IXmlHelper xmlHelper,
            IPunchOutOrderRequestLineOutParser lineOutParser,
            IArgumentContract argumentContract)
            : base(xmlHelper, lineOutParser, argumentContract)
            { }
    
          public override PunchOutOrderRequest CreatePunchOutOrderMessageFromXml(string punchOutOrderMessage, string currentDomain)
          {
            // custom - replaced ScrubSharedSecretFromXml with a custom version of it called ScrubXml.
            // In addition to erasing the SharedSecret element from the incoming xml message, it masks
          // all the pCard information with Xs.
          var xml = XmlHelper.CreateXmlDocument(punchOutOrderMessage);
          var obfuscator = PluginLocator.GetPlugin();
    
          var orderRequest = new PunchOutOrderRequest
          {
            FromIdentity = XmlHelper.GetInnerTextFromNode(xml, "cXML/Header/From/Credential/Identity"),
            ToIdentity = XmlHelper.GetInnerTextFromNode(xml, "cXML/Header/To/Credential/Identity"),
            SenderIdentity = XmlHelper.GetInnerTextFromNode(xml, "cXML/Header/Sender/Credential/Identity"),
            SecretWord = XmlHelper.GetInnerTextFromNode(xml, "cXML/Header/Sender/Credential/SharedSecret"),
            FromUserAgent = XmlHelper.GetInnerTextFromNode(xml, "cXML/Header/Sender/UserAgent"),
            OrderId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "orderID"),
            OrderDate = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "orderDate"),
            OrderType = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "orderType"),
            ReleaseRequired = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "releaseRequired"),
            Type = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "type"),
            OrderVersion = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "orderVersion"),
            IsInternalVersion = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "isInternalVersion"),
            AgreementId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "agreementID"),
            AgreementPayloadId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "agreementPayloadID"),
            ParentAgreementId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "parentAgreementID"),
            ParentAgreementPayloadId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "parentAgreementPayloadID"),
            EffectiveDate = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "effectiveDate"),
            ExpirationDate = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "expirationDate"),
            RequisitionId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "requisitionID"),
            ShipComplete = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader", "shipComplete"),
            PunchOutOrderRequestCXml = obfuscator.Obfuscate(punchOutOrderMessage),
            Total = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Total/Money"),
            TotalCurrency = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Total/Money", "currency"),
            Shipping = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Shipping/Money"),
            ShippingCurrency = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Shipping/Money", "currency"),
            ShippingDescription = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Shipping/Description"),
            BillToAddressId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address", "addressID"),
            BillToCity = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/City"),
            BillToName = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Name"),
            BillToCountry = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/Country"),
            BillToPostalCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/PostalCode"),
            BillToState = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/State"),
            BillToIsoCountryCode = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/Country", "isoCountryCode"),
            BillToEmail = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Email"),
            BillToTelephoneNumber = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Phone/TelephoneNumber/Number"),
            BillToTelephoneAreaOrCityCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Phone/TelephoneNumber/AreaOrCityCode"),
            BillToTelephoneCountryCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Phone/TelephoneNumber/CountryCode"),
            BillToTelephoneIsoCountryCode = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/Phone/TelephoneNumber/CountryCode", "isoCountryCode"),
            ShipToAddressId = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address", "addressID"),
            ShipToCity = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/City"),
            ShipToName = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Name"),
            ShipToCountry = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/Country"),
            ShipToPostalCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/PostalCode"),
            ShipToState = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/State"),
            ShipToIsoCountryCode = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/Country", "isoCountryCode"),
            ShipToEmail = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Email"),
            ShipToTelephoneNumber = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Phone/TelephoneNumber/Number"),
            ShipToTelephoneAreaOrCityCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Phone/TelephoneNumber/AreaOrCityCode"),
            ShipToTelephoneCountryCode = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Phone/TelephoneNumber/CountryCode"),
            ShipToTelephoneIsoCountryCode = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/Phone/TelephoneNumber/CountryCode", "isoCountryCode"),
            Comments = XmlHelper.GetInnerTextFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Comments"),
            PaymentCardDate = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Payment/PCard", "expiration"),
            PaymentCardNumber = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Payment/PCard", "number")
          };
                    
          //custom
          HttpContext.Current.Items["PCardName"] = XmlHelper.GetPropertyFromNode(xml, "cXML/Request/OrderRequest/OrderRequestHeader/Payment/PCard", "name");
          HttpContext.Current.Items["PCard"] = orderRequest.PaymentCardNumber;
          HttpContext.Current.Items["PCardDate"] = orderRequest.PaymentCardDate;
          //end custom
    
          ParseExtrinsics(orderRequest, xml);
          ParsePo(orderRequest, xml);
    
          orderRequest = PunchOutOrderRequestLineOutParser.ParseLineOuts(xml, orderRequest);
          orderRequest = ParseDeliverTo(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/DeliverTo", orderRequest);
          orderRequest = ParseDeliverTo(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/DeliverTo", orderRequest);
          orderRequest = ParseAddress(xml, "cXML/Request/OrderRequest/OrderRequestHeader/BillTo/Address/PostalAddress/Street", orderRequest);
          orderRequest = ParseAddress(xml, "cXML/Request/OrderRequest/OrderRequestHeader/ShipTo/Address/PostalAddress/Street", orderRequest);
      
          return orderRequest;
        }
      }
    }

What’s Next
Did this page help you?