OBJECT Codeunit 50100 DW WebService
{
  OBJECT-PROPERTIES
  {
    Date=06-09-23;
    Time=12:49:10;
    Modified=Yes;
    Version List=1.2.0.20_NAV2018;
  }
  PROPERTIES
  {
    OnRun=VAR
            webservices@1000000000 : Record 2000000076;
          BEGIN
            CLEAR(webservices);
            IF NOT webservices.GET(webservices."Object Type"::Codeunit,'DWWebService') THEN BEGIN
              webservices.INIT;
              webservices."Object Type" := webservices."Object Type"::Codeunit;
              webservices."Service Name" := 'DWWebService';
              webservices."Object ID" := 50100;
              webservices.Published := TRUE;
              webservices.INSERT;
            END;
            Add_DynamicwebShippingItemCharge();
          END;

  }
  CODE
  {
    VAR
      NormalCaseMode@1000000000 : Boolean;
      Text000@1000000002 : TextConst 'DAN=Det er ikke muligt at oprette element %1.;ENU=Could not create element %1.';
      Text001@1000000001 : TextConst 'DAN=Det er ikke muligt at oprette attribut %1.;ENU=Could not create attribute %1.';
      FoundSalesPrice@1000000003 : Boolean;
      AllowLineDisc@1000000004 : Boolean;
      AllowInvDisc@1000000005 : Boolean;
      QtyPerUOM@1000000006 : Decimal;
      Qty@1000000007 : Decimal;
      Text010@1000000008 : TextConst 'DAN=Priser inkl. moms kan ikke beregnes, n†r %1 er %2.;ENU=Prices including VAT cannot be calculated when %1 is %2.';
      VATCalcType@1000000009 : 'Normal VAT,Reverse Charge VAT,Full VAT,Sales Tax';
      PricesInclVAT@1000000010 : Boolean;
      VATBusPostingGr@1000000011 : Code[20];
      VATPerCent@1000000012 : Decimal;
      PricesInCurrency@1000000013 : Boolean;
      ExchRateDate@1000000014 : Date;
      Currency@1000000015 : Record 4;
      GLSetup@1000000017 : Record 98;
      LineDiscPerCent@1000000018 : Decimal;
      CurrencyFactor@1000000016 : Decimal;
      Order_OrderPriceWithVAT@1000000020 : Decimal;
      Order_OrderPriceWithoutVAT@1000000021 : Decimal;
      Order_OrderPriceVAT@1000000022 : Decimal;
      Order_OrderSalesDiscount@1000000023 : Decimal;
      DefaultLanguageId@1000000024 : Text;
      DynamicwebShippingItemChargeNo@1000000019 : TextConst 'ENU=DW-SHIP';
      Version@1000000025 : Text;

    [External]
    PROCEDURE Process@1000000012(VAR Request@1000000000 : BigText);
    VAR
      xmlrootnode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocIn@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      language@1000000003 : Record 8;
    BEGIN
      DefaultLanguageId := language.GetUserLanguage;
      ConvertBigTestToXml(XMLdocIn,Request);
      // The version number of this codeunit/app is reserved for Dynamicweb's standard code.
      // If you intend to customize this codeunit/app, you must append your version number.
      // Your version must be 1.2.0.0.xxxxx, where 'xxxxx' is your appended version.
      // Failure to append your version will invalidate your license.
      Version := '1.2.0.20';

      xmlrootnode := XMLdocIn.DocumentElement;
      CASE xmlrootnode.LocalName OF
        'GetEcomData': GetEcomData(Request,XMLdocIn);
        'GetAllEcomData': GetAllEcomData(Request, XMLdocIn);
        'PutEcomOrders': PutEcomOrders(Request,XMLdocIn);
        'CalculateOrder': PutEcomOrdersLiveOld(Request,XMLdocIn);//Old Live integration 1
        'tables':
          BEGIN
            IF (Get_TextFromNode(XMLdocIn,'/tables/@submitType') = 'LiveOrderOrCart') OR (Get_TextFromNode(XMLdocIn,'/tables/@submitType') = 'ManualSubmit') OR
              (Get_TextFromNode(XMLdocIn,'/tables/@submitType') = 'ScheduledTask') THEN
              PutEcomOrdersLive(Request,XMLdocIn);
          END;
        'PutEcomUsers': PutEcomUsers(Request,XMLdocIn);
        'GetPDFForItem':
          BEGIN
            CLEAR(Request);
            CASE Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@type') OF
              'OpenOrder': Request.ADDTEXT(PrintReportasPDF(1,Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@id'), Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@externalUserID')));
              'Invoice': Request.ADDTEXT(PrintReportasPDF(2,Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@id'), Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@externalUserID')));
              'Credit': Request.ADDTEXT(PrintReportasPDF(3,Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@id'), Get_TextFromNode(XMLdocIn,'/GetPDFForItem/@externalUserID')));
              ELSE
                ERROR(STRSUBSTNO('Report %1 NOT FOUND',xmlrootnode.LocalName));
            END;
          END;
          'GetList':
          BEGIN
            CLEAR(Request);
            CASE Get_TextFromNode(XMLdocIn,'/GetList/@type') OF
              'OpenOrder': GetList(1,Get_TextFromNode(XMLdocIn,'/GetList/@customerID'),Request,XMLdocIn);
              'Invoice': GetList(2,Get_TextFromNode(XMLdocIn,'/GetList/@customerID'),Request,XMLdocIn);
              'Credit': GetList(3,Get_TextFromNode(XMLdocIn,'/GetList/@customerID'),Request,XMLdocIn);
              ELSE
                ERROR(STRSUBSTNO('table %1 NOT FOUND',xmlrootnode.LocalName));
            END;
          END;
          'GetItem':
          BEGIN
            CLEAR(Request);
            CASE Get_TextFromNode(XMLdocIn,'/GetItem/@type') OF
              'OpenOrder': GetItem(1,Request,XMLdocIn);
              'Invoice': GetItem(2,Request,XMLdocIn);
              'Credit': GetItem(3,Request,XMLdocIn);
              ELSE
                ERROR(STRSUBSTNO('table %1 NOT FOUND',xmlrootnode.LocalName));
            END;
          END;
          'GetCustomerStatementPDF':
          BEGIN
            CLEAR(Request);
            Request.ADDTEXT(PrintCustomerStatementAsPDF(Get_TextFromNode(XMLdocIn,'/GetCustomerStatementPDF/@customerID'),
              Get_TextFromNode(XMLdocIn,'/GetCustomerStatementPDF/@startDate'),
              Get_TextFromNode(XMLdocIn,'/GetCustomerStatementPDF/@endDate')));
          END;
        ELSE
          ERROR(STRSUBSTNO('METHOD %1 NOT FOUND',xmlrootnode.LocalName));
      END;
    END;

    LOCAL PROCEDURE GetEcomData@1000000009(VAR Request@1000000000 : BigText;XMLdocIn@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      Header@1000000004 : Text[1000];
      XMLCurrNode@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocOut@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      XMLFilterNode@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      skipContacts@1000000007 : Boolean;
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><tables/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/@ExternalUserID') <> '') OR (Get_TextFromNode(XMLdocIn,'/GetEcomData/@AccessUserCustomerNumber') <> '') THEN BEGIN
        //Old Live integration 1
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/@ExternalUserID') <> '') THEN BEGIN
            IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@type') = 'all') THEN BEGIN
              Add_EcomProductsCustomer(XMLCurrNode,TRUE,Get_TextFromNode(XMLdocIn,'/GetEcomData/@ExternalUserID'),XMLFilterNode, FALSE);
            END;
            IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@type') = 'filter') THEN BEGIN
              XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Products/Product');
              Add_EcomProductsCustomer(XMLCurrNode,FALSE,Get_TextFromNode(XMLdocIn,'/GetEcomData/@ExternalUserID'),XMLFilterNode, FALSE);
            END;
        //End Old Live integration 1
        END ELSE BEGIN
          IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@type') = 'all') THEN BEGIN
                Add_EcomProductsCustomer(XMLCurrNode,TRUE,Get_TextFromNode(XMLdocIn,'/GetEcomData/@AccessUserCustomerNumber'),XMLFilterNode, FALSE);
          END;
          IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@type') = 'filter') THEN BEGIN
                XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Products/Product');
                Add_EcomProductsCustomer(XMLCurrNode,FALSE,Get_TextFromNode(XMLdocIn,'/GetEcomData/@AccessUserCustomerNumber'),XMLFilterNode,
                  Get_BoolFromNode(XMLdocIn, '/GetEcomData/tables/Products/@unitPrices'));
          END;
        END;
      END ELSE BEGIN
        //Users
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Users/@type') = 'all') OR (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Contacts/@type') = 'all') THEN
            Add_AccessUser(XMLCurrNode,TRUE,XMLFilterNode,TRUE,FALSE);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Users/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Users/userName');
            Add_AccessUser(XMLCurrNode,FALSE,XMLFilterNode,TRUE,FALSE);
        END;
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Contacts/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Contacts/ContactId');
            Add_AccessUser(XMLCurrNode,FALSE,XMLFilterNode,TRUE,FALSE);
        END;
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Customers/@type') = 'all') THEN BEGIN
          IF Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/Customers/@importContacts') = '' THEN
            skipContacts := FALSE
          ELSE
            skipContacts := NOT Get_BoolFromNode(XMLdocIn, '/GetEcomData/tables/Customers/@importContacts');
          Add_AccessUser(XMLCurrNode,TRUE,XMLFilterNode,Get_BoolFromNode(XMLdocIn,'/GetEcomData/tables/Customers/@importSalesPeople'), skipContacts);
          IF skipContacts THEN
            Add_CustomerAccessUserAddress(XMLCurrNode)
          ELSE
            Add_AccessUserAddress(XMLCurrNode,TRUE,XMLFilterNode);
        END;
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Addresses/@type') = 'all') THEN
            Add_AccessUserAddress(XMLCurrNode,TRUE,XMLFilterNode);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Addresses/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Addresses/ContactId');
            Add_AccessUserAddress(XMLCurrNode,FALSE,XMLFilterNode);
        END;
        //End Users

        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Countries/@type') = 'all') THEN
            Add_EcomCountries(XMLCurrNode,TRUE,XMLFilterNode);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Countries/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Countries/Country/countryCode');
            Add_EcomCountries(XMLCurrNode,FALSE,XMLFilterNode);
        END;

        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Currencies/@type') = 'all') THEN
            Add_EcomCurrencies(XMLCurrNode,TRUE,XMLFilterNode);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Currencies/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Countries/Currencies/currencyCode');
            Add_EcomCurrencies(XMLCurrNode,FALSE,XMLFilterNode);
        END;

        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Languages/@type') = 'all') THEN
            Add_EcomLanguages(XMLCurrNode,TRUE,XMLFilterNode);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Languages/@type') = 'filter') THEN BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Languages/languageID');
            Add_EcomLanguages(XMLCurrNode,FALSE,XMLFilterNode);
        END;

        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Manufacturers/@type') = 'all') THEN
            Add_EcomManufacturers(XMLCurrNode,TRUE,XMLFilterNode);
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Manufacturers/@type') = 'filter') THEN  BEGIN
            XMLFilterNode := XMLdocIn.SelectNodes('/GetEcomData/tables/Manufacturers/manufacturerId');
            Add_EcomManufacturers(XMLCurrNode,FALSE,XMLFilterNode);
        END;
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@type') = 'all') THEN
          Add_EcomProducts(XMLdocIn,XMLCurrNode,
          Get_BoolFromNode(XMLdocIn,'/GetEcomData/tables/Products/@importProductProperties'));
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/ProductGroups/@type') = 'all') THEN
          Add_EcomGroups(XMLdocIn,XMLCurrNode);

        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/ProductStock/@type') = 'all') THEN BEGIN
            IF Get_BoolFromNode(XMLdocIn,'/GetEcomData/tables/ProductStock/@importStockLocations') THEN BEGIN
              Add_Locations(XMLCurrNode);
              Add_StockUnits(XMLCurrNode);
            END ELSE BEGIN
              Add_ProductsStock(XMLCurrNode);
            END;
        END;
        IF (Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Units/@type') = 'all') THEN BEGIN
          Add_Units(XMLCurrNode);
        END;
        IF (Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@type') = 'all') THEN BEGIN
            GetProductPrices(XMLCurrNode,
            Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@salesType'),
            Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@salesCode'),
            Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@setLanguage'),
            Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@setCurrency'),
            Get_TextFromNode(XMLdocIn, '/GetEcomData/tables/ProductPrices/@setUnitOfMeasure'));
        END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE PutEcomOrders@1000000010(VAR Request@1000000000 : BigText;XMLdocIn@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      XMLNodeList@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000003 : Integer;
      XMLNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      salesheader@1000000005 : Record 36;
      salesline@1000000010 : Record 37;
      XMLdocOut@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      Header@1000000007 : Text[1000];
      XMLCurrNode@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000009 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      pXmlNode@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      message@1000000012 : Text;
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><createdOrders/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      XMLNodeList := XMLdocIn.SelectNodes('/PutEcomOrders/table[@tableName=''EcomOrders'']/item');
      FOR i := 0 TO XMLNodeList.Count -1  DO BEGIN
        XMLNode := XMLNodeList.ItemOf(i);
        message := PutEcomOrder(XMLdocIn, XMLNode, XMLdocOut, XMLCurrNode);
        IF message <> '' THEN BEGIN
          Add_Element(XMLCurrNode,'failedOrder','','',XMLNewChild,'');
          Add_Element(XMLNewChild,'OrderID',Get_TextFromNode(XMLNode,'column[@columnName=''OrderID'']'),'',XMLNewChild,'');
          XMLNewChild := XMLNewChild.ParentNode;
          Add_Element(XMLNewChild, 'error', message, '', XMLNewChild, '');
        END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE PutEcomOrdersLiveOld@1000000014(VAR Request@1000000000 : BigText;XMLdocIn@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      XMLNodeList@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      XMLNodeListLines@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      XMLNodeListDiscount@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000003 : Integer;
      u@1000000013 : Integer;
      XMLNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNodeDiscount@1000000014 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      salesheader@1000000005 : Record 36;
      salesline@1000000010 : Record 37;
      XMLdocOut@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      Header@1000000007 : Text[1000];
      XMLCurrNode@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000009 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      lineno@1000000011 : Integer;
      pricemgt@1000000021 : Codeunit 7000;
      TempSalesPrice@1000000020 : TEMPORARY Record 7002;
      TempSalesLineDisc@1000000019 : TEMPORARY Record 7004;
      TempSalesHeader@1000000018 : TEMPORARY Record 36;
      TempSalesLine@1000000017 : TEMPORARY Record 37;
      VATPostingSetup@1000000016 : Record 325;
      customer@1000000022 : Record 18;
      item@1000000023 : Record 27;
      Discount@1000000024 : Decimal;
      Total@1000000025 : Decimal;
      PriceCalcMgt@1000000026 : Codeunit 7000;
      CurrExchRate@1000000027 : Record 330;
      sellToCustomer@1000000028 : Record 18;
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><tables/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      XMLNodeList := XMLdocIn.SelectNodes('/CalculateOrder/Orders/Order');
      FOR i := 0 TO XMLNodeList.Count -1  DO BEGIN
        XMLNode := XMLNodeList.ItemOf(i);
        GetCustomer(Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerAccessUserExternalId'']'), customer);
        IF (Get_TextFromNode(XMLNode,'column[@columnName=''CreateOrder'']') = 'True')  THEN BEGIN

          Total := 0;
          Discount := 0;

          CLEAR(salesheader);
          salesheader.INIT;
          salesheader."Document Type" := salesheader."Document Type"::Order;
          salesheader."No." := '';
          salesheader.INSERT(TRUE);

          salesheader.VALIDATE("Sell-to Customer No.", customer."No.");

          IF (customer."Bill-to Customer No." <> '') THEN
            salesheader.VALIDATE("Bill-to Customer No.", customer."Bill-to Customer No.");

          salesheader.VALIDATE("Sell-to Address" ,Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerAddress'']'));
          salesheader.VALIDATE("Sell-to Address 2", Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerAddress2'']'));
          salesheader.VALIDATE("Sell-to Post Code" ,Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerZip'']'));
          salesheader.VALIDATE("Sell-to City" ,Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerCity'']'));

          salesheader.VALIDATE("Ship-to Name" ,Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryName'']'));
          salesheader.VALIDATE("Ship-to Address" ,Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryAddress'']'));
          salesheader.VALIDATE("Ship-to Address 2", Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryAddress2'']'));
          salesheader.VALIDATE("Ship-to Post Code" , Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryZip'']'));
          salesheader.VALIDATE("Ship-to City" , Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryCity'']'));

          IF Currency.GET(Get_TextFromNode(XMLNode,'column[@columnName=''OrderCurrencyCode'']')) THEN BEGIN
             salesheader.VALIDATE("Currency Code" , Get_TextFromNode(XMLNode,'column[@columnName=''OrderCurrencyCode'']'));
          END;

          salesheader.MODIFY(TRUE);


          lineno := 10000;

          XMLNodeListLines := XMLdocIn.SelectNodes('/CalculateOrder/OrderLines/OrderLine');
          XMLNodeListDiscount := XMLdocIn.SelectNodes('/CalculateOrder/OrderLines/OrderLine');

          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');


          FOR u := 0 TO XMLNodeListLines.Count() -1  DO BEGIN
            XMLNode := XMLNodeListLines.ItemOf(u);

            salesline.INIT;
            salesline."Document Type" := salesheader."Document Type";
            salesline."Document No." := salesheader."No.";
            salesline."Line No." := lineno;
            salesline.Type := salesline.Type::Item;
            salesline.INSERT(TRUE);
            salesline.VALIDATE("No.",DELCHR(Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductID'']'), '=','(|)'));
            salesline.VALIDATE(Quantity,Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLineQuantity'']'));
            salesline.MODIFY(TRUE);

            Add_SalesLine(salesheader, salesline,XMLNewChild,'',FALSE,FALSE,'','');
            IF (salesline."Line Discount Amount" <> 0) THEN
              Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,FALSE,'','');
            lineno += 10000;

          END;

          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrders');

          Add_SalesHeaderXml(salesheader,XMLNewChild,FALSE,Total,Discount,FALSE,FALSE);


        END ELSE BEGIN
          salesheader.INIT;
          salesheader."Document Type" := salesheader."Document Type"::Order;
          salesheader."No." := '';
          salesheader."Sell-to Customer No." := customer."No.";
          sellToCustomer := customer;
          IF (customer."Bill-to Customer No." <> '') THEN BEGIN
              salesheader."Bill-to Customer No." := customer."Bill-to Customer No.";
              customer.GET(customer."Bill-to Customer No.");
          END;
          salesheader."Sell-to Country/Region Code" := customer."Country/Region Code";
          salesheader."Ship-to Country/Region Code" := customer."Country/Region Code";
          salesheader."Sell-to Customer Name" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerName'']');
          salesheader."Sell-to Address"  := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerAddress'']');
          salesheader."Sell-to Address 2" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerAddress2'']');
          salesheader."Sell-to Post Code"  := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerZip'']');
          salesheader."Sell-to City"  := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCustomerCity'']');
          salesheader."Ship-to Name"  := Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryName'']');
          salesheader."Ship-to Address"  := Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryAddress'']');
          salesheader."Ship-to Address 2" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryAddress2'']');
          salesheader."Ship-to Post Code" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryZip'']');
          salesheader."Ship-to City" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderDeliveryCity'']');
          IF Currency.GET(Get_TextFromNode(XMLNode,'column[@columnName=''OrderCurrencyCode'']')) THEN BEGIN
            salesheader."Currency Code" := Get_TextFromNode(XMLNode,'column[@columnName=''OrderCurrencyCode'']');
          END;

          salesheader."Prices Including VAT" := customer."Prices Including VAT";

          lineno := 10000;

          XMLNodeListLines := XMLdocIn.SelectNodes('/CalculateOrder/OrderLines/OrderLine');

          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

          FOR u := 0 TO XMLNodeListLines.Count() -1  DO BEGIN
            XMLNode := XMLNodeListLines.ItemOf(u);

            item.GET(Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductID'']'));

            salesline.INIT;
            salesline."Document Type" := salesheader."Document Type";
            salesline."Document No." := salesheader."No.";
            salesline."Line No." := lineno;
            salesline.Type := salesline.Type::Item;
            salesline."No." := item."No.";
            salesline.Quantity := Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLineQuantity'']');
            salesline."Qty. per Unit of Measure" := 1;

            item.GET(salesline."No.");
            VATPostingSetup.GET(customer."VAT Bus. Posting Group",item."VAT Prod. Posting Group");
            AllowLineDisc := customer."Allow Line Disc.";
            AllowInvDisc := item."Allow Invoice Disc.";
            Qty :=  salesline.Quantity;
            QtyPerUOM := 1;
            VATCalcType := VATPostingSetup."VAT Calculation Type";
            PricesInclVAT := customer."Prices Including VAT";
            VATBusPostingGr := customer."VAT Bus. Posting Group";
            VATPerCent := VATPostingSetup."VAT %";
            PricesInCurrency := TRUE;
            IF VATCalcType <> VATPostingSetup."VAT Calculation Type"::"Reverse Charge VAT" THEN
            salesline."VAT %" := VATPostingSetup."VAT %";

            ExchRateDate := TODAY;
            GLSetup.GET;
            IF Currency.GET(salesheader."Currency Code") THEN BEGIN
              Currency.SETRECFILTER();
              CurrencyFactor := CurrExchRate.ExchangeRate(ExchRateDate,Currency.Code);
            END ELSE BEGIN
              CurrencyFactor := 1
            END;


            CLEAR(TempSalesPrice);
            CLEAR(TempSalesLineDisc);
            TempSalesPrice.DELETEALL;
            TempSalesLineDisc.DELETEALL;

            pricemgt.FindSalesLineDisc(TempSalesLineDisc, customer."No.",'',customer."Customer Disc. Group",'',item."No.",item."Item Disc. Group",'',item."Base Unit of Measure",Currency.Code,ExchRateDate,FALSE);
            CalcBestLineDisc(TempSalesLineDisc);
            LineDiscPerCent := TempSalesLineDisc."Line Discount %";

            salesline."Line Discount %" :=  TempSalesLineDisc."Line Discount %";


            pricemgt.FindSalesPrice(TempSalesPrice,sellToCustomer."No.",'',sellToCustomer."Customer Price Group",'',item."No.",'',item."Base Unit of Measure",Currency.Code,ExchRateDate,FALSE);
            CalcBestUnitPrice(TempSalesPrice,item);

            LineDiscPerCent := 0;
            salesline."Unit Price"  := CalcLineAmount(TempSalesPrice);
            LineDiscPerCent := TempSalesLineDisc."Line Discount %";

            salesline."Line Discount Amount" :=
            ROUND(
              ROUND(salesline.Quantity * TempSalesPrice."Unit Price",Currency."Amount Rounding Precision") *
              LineDiscPerCent / 100,Currency."Amount Rounding Precision");


            Add_SalesLine(salesheader,salesline, XMLNewChild,'',FALSE,FALSE,'','');


            IF (salesline."Line Discount Amount" <> 0) THEN
              Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,FALSE,'','');
            lineno += 10000;

          END;

          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrders');


          Add_SalesHeaderXml(salesheader,XMLNewChild,TRUE,Total,Discount,FALSE,FALSE);


        END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE PutEcomOrdersLive@1000000042(VAR Request@1000000000 : BigText;XMLdocIn@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      XMLNodeList@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      XMLNodeListLines@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      XMLNodeListDiscount@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000003 : Integer;
      u@1000000013 : Integer;
      XMLNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNodeDiscount@1000000014 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      salesheader@1000000005 : Record 36;
      salesline@1000000010 : Record 37;
      XMLdocOut@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      Header@1000000007 : Text[1000];
      XMLCurrNode@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000009 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      lineno@1000000011 : Integer;
      pricemgt@1000000021 : Codeunit 7000;
      TempSalesPrice@1000000020 : TEMPORARY Record 7002;
      TempSalesLineDisc@1000000019 : TEMPORARY Record 7004;
      TempSalesHeader@1000000018 : TEMPORARY Record 36;
      TempSalesLine@1000000017 : TEMPORARY Record 37;
      VATPostingSetup@1000000016 : Record 325;
      customer@1000000022 : Record 18;
      item@1000000023 : Record 27;
      Discount@1000000024 : Decimal;
      Total@1000000025 : Decimal;
      PriceCalcMgt@1000000026 : Codeunit 7000;
      CurrExchRate@1000000027 : Record 330;
      useDynamicwebDiscount@1000000028 : Boolean;
      dynamicwebDiscountAmount@1000000030 : Decimal;
      j@1000000031 : Integer;
      totalDynamicwebDiscountAmount@1000000032 : Decimal;
      dwProductDiscountSalesLine@1000000029 : Record 37;
      dwOrderLineIds@1000000033 : ARRAY [10000,2] OF Text;
      arrayCounter@1000000034 : Integer;
      XMLOrderNode@1000000040 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      orderDiscountPercent@1000000035 : Decimal;
      orderCurrencyCode@1000000036 : Text;
      productOrderLinesCount@1000000037 : Integer;
      uom@1000000038 : Text;
      itemUOM@1000000039 : Record 5404;
      firstOrderLineItem@1000000041 : Record 27;
      orderLines@1000000042 : ARRAY [10000] OF Variant;
      orderLinesCounter@1000000043 : Integer;
      invoiceDiscountAmountWithVat@1000000045 : Decimal;
      anyLineHasDifferentVatPercent@1000000046 : Boolean;
      sellToCustomer@1000000044 : Record 18;
      variantCode@1000000047 : Text;
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><tables/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      XMLNodeList := XMLdocIn.SelectNodes('/tables/table[@tableName=''EcomOrders'']/item');
      FOR i := 0 TO XMLNodeList.Count - 1  DO BEGIN
        XMLOrderNode := XMLNodeList.ItemOf(i);
        GetCustomer(Get_TextFromNode(XMLOrderNode, 'column[@columnName=''OrderCustomerNumber'']'), customer);
        useDynamicwebDiscount := NOT Get_BoolFromNode(XMLOrderNode,'column[@columnName=''ErpControlsDiscount'']');
        IF useDynamicwebDiscount THEN BEGIN
            XMLNodeListDiscount := XMLdocIn.SelectNodes('/tables/table[@tableName=''EcomOrderLines'']/item');
        END;
        orderCurrencyCode := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCurrencyCode'']');

        IF (Get_TextFromNode(XMLOrderNode,'column[@columnName=''CreateOrder'']') = 'True')  THEN BEGIN
          CreateOrder(XMLOrderNode, XMLdocIn, XMLCurrNode, useDynamicwebDiscount, XMLNodeListDiscount, orderCurrencyCode, customer, TRUE);
        END ELSE BEGIN
          salesheader.INIT;
          salesheader."Document Type" := salesheader."Document Type"::Order;
          salesheader."No." := '';
          salesheader."Sell-to Customer No." := customer."No.";
          sellToCustomer := customer;
          IF (customer."Bill-to Customer No." <> '') THEN BEGIN
              salesheader."Bill-to Customer No." := customer."Bill-to Customer No.";
              customer.GET(customer."Bill-to Customer No.");
          END;
          salesheader."Sell-to Country/Region Code" := customer."Country/Region Code";
          salesheader."Ship-to Country/Region Code" := customer."Country/Region Code";
          salesheader."Sell-to Customer Name" := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerName'']');
          salesheader."Sell-to Address"  := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerAddress'']');
          salesheader."Sell-to Address 2" := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerAddress2'']');
          salesheader."Sell-to Post Code"  := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerZip'']');
          salesheader."Sell-to City"  := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerCity'']');
          salesheader."Ship-to Name"  := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryName'']');
          salesheader."Ship-to Address"  := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryAddress'']');
          salesheader."Ship-to Address 2" := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryAddress2'']');
          salesheader."Ship-to Post Code" := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryZip'']');
          salesheader."Ship-to City" := Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryCity'']');
          salesheader."Customer Disc. Group" := customer."Customer Disc. Group";
          salesheader."Customer Price Group" := customer."Customer Price Group";
          salesheader."Allow Line Disc." := customer."Allow Line Disc.";
          salesheader."VAT Bus. Posting Group" := customer."VAT Bus. Posting Group";
          salesheader."Customer Posting Group" := customer."Customer Posting Group";
          IF Currency.GET(orderCurrencyCode) THEN BEGIN
            salesheader."Currency Code" := orderCurrencyCode;
          END;

          salesheader."Prices Including VAT" := customer."Prices Including VAT";

          lineno := 10000;
          orderLinesCounter := 1;

          XMLNodeListLines := XMLdocIn.SelectNodes('/tables/table[@tableName=''EcomOrderLines'']/item');

          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

          FOR u := 0 TO XMLNodeListLines.Count() -1  DO BEGIN
            XMLNode := XMLNodeListLines.ItemOf(u);

            IF (NOT useDynamicwebDiscount) OR (useDynamicwebDiscount AND (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') <> '3')) THEN
            IF Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductId'']') <> '' THEN BEGIN
              item.GET(Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductId'']'));
              IF u = 0 THEN
                firstOrderLineItem := item;

              salesline.INIT;
              salesline."Document Type" := salesheader."Document Type";
              salesline."Document No." := salesheader."No.";
              salesline."Line No." := lineno;
              salesline.Type := salesline.Type::Item;
              salesline."No." := item."No.";
              variantCode := GetTextFromNode(XMLNode, 'column[@columnName=''OrderLineProductVariantId'']', MAXSTRLEN(salesline."Variant Code"));
              salesline."Variant Code" := variantCode;
              salesline.Quantity := Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLineQuantity'']');
              uom := GetUOMCode(Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineUnitId'']'));
              IF uom <> '' THEN BEGIN
                itemUOM.GET(item."No.", uom);
                salesline."Unit of Measure" := uom;
                salesline."Unit of Measure Code" := uom;
                QtyPerUOM := itemUOM."Qty. per Unit of Measure";
              END ELSE BEGIN
                uom := item."Base Unit of Measure";
                QtyPerUOM := 1;
              END;

              salesline."Qty. per Unit of Measure" := 1;

              item.GET(salesline."No.");
              VATPostingSetup.GET(customer."VAT Bus. Posting Group",item."VAT Prod. Posting Group");
              AllowLineDisc := customer."Allow Line Disc.";
              AllowInvDisc := item."Allow Invoice Disc.";
              Qty :=  salesline.Quantity;

              VATCalcType := VATPostingSetup."VAT Calculation Type";
              PricesInclVAT := customer."Prices Including VAT";
              VATBusPostingGr := customer."VAT Bus. Posting Group";
              VATPerCent := VATPostingSetup."VAT %";
              PricesInCurrency := TRUE;

              IF VATCalcType <> VATPostingSetup."VAT Calculation Type"::"Reverse Charge VAT" THEN
                salesline."VAT %" := VATPostingSetup."VAT %";

              ExchRateDate := TODAY;
              GLSetup.GET;
              IF Currency.GET(salesheader."Currency Code") THEN BEGIN
                Currency.SETRECFILTER();
                CurrencyFactor := CurrExchRate.ExchangeRate(ExchRateDate,Currency.Code);
              END ELSE BEGIN
                CurrencyFactor := 1
              END;

              CLEAR(TempSalesPrice);
              CLEAR(TempSalesLineDisc);
              TempSalesPrice.DELETEALL;
              TempSalesLineDisc.DELETEALL;

              IF NOT useDynamicwebDiscount THEN BEGIN
                pricemgt.FindSalesLineDisc(TempSalesLineDisc, customer."No.",'',customer."Customer Disc. Group",'',item."No.",item."Item Disc. Group",variantCode,uom,Currency.Code,ExchRateDate,FALSE);
                CalcBestLineDisc(TempSalesLineDisc);
                LineDiscPerCent := TempSalesLineDisc."Line Discount %";

                salesline."Line Discount %" :=  TempSalesLineDisc."Line Discount %";
              END;

              pricemgt.FindSalesPrice(TempSalesPrice,sellToCustomer."No.",'',sellToCustomer."Customer Price Group",'',item."No.",variantCode,uom,Currency.Code,ExchRateDate,FALSE);
              CalcBestUnitPrice(TempSalesPrice,item);

              LineDiscPerCent := 0;
              salesline."Unit Price" := CalcLineAmount(TempSalesPrice);
              salesline."Allow Invoice Disc." := TempSalesPrice."Allow Invoice Disc.";

              IF TempSalesPrice."Allow Line Disc." THEN BEGIN
                LineDiscPerCent := TempSalesLineDisc."Line Discount %";
              END ELSE BEGIN
                salesline."Line Discount %" := 0;
              END;
              IF NOT useDynamicwebDiscount THEN BEGIN
                IF TempSalesPrice."Allow Line Disc." THEN BEGIN
                    salesline."Line Discount Amount" :=
                    ROUND(
                      ROUND(salesline.Quantity * TempSalesPrice."Unit Price",Currency."Amount Rounding Precision") *
                      LineDiscPerCent / 100,Currency."Amount Rounding Precision");
                  END;
              END;

              Add_SalesLine(salesheader,salesline, XMLNewChild,'',FALSE,TRUE,'','');
              orderLines[orderLinesCounter] := salesline;
              orderLinesCounter := orderLinesCounter + 1;

              IF useDynamicwebDiscount THEN BEGIN
                FOR j := 0 TO XMLNodeListDiscount.Count - 1  DO BEGIN
                  XMLNodeDiscount := XMLNodeListDiscount.ItemOf(j);
                  //handle DW product discount order line
                  IF (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineId'']') = Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineParentLineId'']')) AND
                     (Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineType'']') = '3') AND
                     (Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductId'']') <> '') THEN BEGIN
                      dwProductDiscountSalesLine.INIT();
                      dwProductDiscountSalesLine."No." := Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductId'']');
                      dwProductDiscountSalesLine."Variant Code" := GetTextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductVariantId'']', MAXSTRLEN(dwProductDiscountSalesLine."Variant Code"));
                      dwProductDiscountSalesLine."Line No." := salesline."Line No.";
                      Add_SalesLine(salesheader,dwProductDiscountSalesLine,XMLNewChild,FORMAT(dwProductDiscountSalesLine."Line No."),FALSE,TRUE,
                        Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountId'']'),Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductName'']'));
                  END;
                END;
             END ELSE BEGIN
                IF (salesline."Line Discount Amount" <> 0) THEN
                  Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,TRUE,'','');
              END;

              lineno += 10000;
            END;
          END;
          IF NOT useDynamicwebDiscount THEN BEGIN
            salesheader."Invoice Disc. Code" := customer."Invoice Disc. Code";
            CalculateInvoiceDiscountForLines(salesheader, orderLines, orderLinesCounter, invoiceDiscountAmountWithVat, anyLineHasDifferentVatPercent);
            IF salesheader."Invoice Discount Amount" > 0 THEN BEGIN
                Add_NavOrderDiscountSalesLine(XMLNewChild, salesheader."Invoice Discount Amount", VATPostingSetup, salesheader, invoiceDiscountAmountWithVat, anyLineHasDifferentVatPercent);
            END;
          END;
          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'tableName','EcomOrders');
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomOrders');
          Add_Shipping(XMLNewChild, XMLOrderNode, lineno, salesheader, FALSE, firstOrderLineItem);
          Add_SalesHeader(salesheader,XMLNewChild,FALSE,Total,Discount,FALSE,TRUE);
        END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE PutEcomUsers@1000000011(VAR Request@1000000000 : BigText;XMLdocIn@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      XMLNodeList@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000002 : Integer;
      XMLNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      customer@1000000005 : Record 18;
      Header@1000000009 : Text[1000];
      XMLCurrNode@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocOut@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      XMLRootNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      contact@1000000010 : Record 5050;
      customerCompanyContact@1000000012 : Record 5050;
      pXmlNode@1000000013 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      contactFound@1000000014 : Boolean;
      customerNumber@1000000015 : Text;
      externalUserId@1000000016 : Text;
      accessUserId@1000000017 : Text;
      GenBusPostingGroup@1000000018 : Text;
      VATBusPostingGroup@1000000019 : Text;
      CustomerPostingGroup@1000000020 : Text;
      dwCustomerNumberCustomerNo@1000000021 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2";
      insertedCustomerNo@1000000022 : Code[20];
      Type@1000000023 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type";
      Activator@1000000024 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Activator";
      Arr@1000000025 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      String@1000000026 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
      name@1000000027 : Text[100];
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument();
      Header := '<?xml version="1.0" encoding="utf-8" ?><createdUsers/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      GenBusPostingGroup := Get_TextFromNode(XMLdocIn.DocumentElement, '/PutEcomUsers/@GeneralBusinessPostingGroup');
      VATBusPostingGroup := Get_TextFromNode(XMLdocIn.DocumentElement, '/PutEcomUsers/@VatBusinessPostingGroup');
      CustomerPostingGroup := Get_TextFromNode(XMLdocIn.DocumentElement, '/PutEcomUsers/@CustomerPostingGroup');

      Arr := Arr.CreateInstance(GETDOTNETTYPE(Type),2);
      Arr.SetValue(GETDOTNETTYPE(String),0);
      Arr.SetValue(GETDOTNETTYPE(String),1);
      Type := GETDOTNETTYPE(dwCustomerNumberCustomerNo);
      Type := Type.MakeGenericType(Arr);
      dwCustomerNumberCustomerNo := Activator.CreateInstance(Type);

      XMLNodeList := XMLdocIn.SelectNodes('/PutEcomUsers/table[@tableName=''AccessUser'']/item');
      FOR i := 0 TO XMLNodeList.Count() - 1 DO BEGIN
          XMLNode := XMLNodeList.ItemOf(i);
          CLEAR(contact);
          CLEAR(customer);
          CLEAR(customerCompanyContact);
          contactFound := FALSE;
          externalUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserExternalID'']');
          IF (externalUserId = '') THEN
            externalUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserExternalId'']');
          customerNumber := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserCustomerNumber'']');
          accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserID'']');
          IF accessUserId = '' THEN
            accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserId'']');
          IF accessUserId <> '' THEN BEGIN

            name := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserName'']', MAXSTRLEN(customer.Name));
            IF (name = '') THEN
                name := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserUserName'']', MAXSTRLEN(customer.Name));
            IF name <> '' THEN BEGIN
                IF (externalUserId = '') AND (customerNumber = '') THEN BEGIN
                    //If the DW user has no customer number, then a NAV/BC customer record is first created
                    //and then a contact is created which belongs to this new customer record
                    InsertCustomerAndReturnId(accessUserId, XMLCurrNode, customer);
                    UpdateCustomer(GenBusPostingGroup, VATBusPostingGroup, CustomerPostingGroup, name, XMLNode, customer);
                    CreateUpdateCustomerContact(customer, customerCompanyContact);
                END ELSE BEGIN
                    //if (externalUserId <> '') and (customerNumber = '') then begin
                    //customer number is empty in  this case - do nothing:
                    //If I had forgotten to add a AccessUserCustomerNumber value they would simply not be exported.
                    //end else begin
                    //end;
                    IF (customerNumber <> '') THEN BEGIN
                        IF (externalUserId = customerNumber) THEN BEGIN
                            //It is a customer from DW here
                            IF customer.GET(customerNumber) THEN BEGIN
                                UpdateCustomer(GenBusPostingGroup, VATBusPostingGroup, CustomerPostingGroup, name, XMLNode, customer);
                                //If the DW user already has a known customer number,
                                //then the user is created as a NAV/BC contact belonging to that customer record.
                                CreateUpdateCustomerContact(customer, customerCompanyContact);
                            END;
                        END ELSE BEGIN
                          IF dwCustomerNumberCustomerNo.TryGetValue(customerNumber, insertedCustomerNo) THEN
                              customerNumber := insertedCustomerNo;

                            IF NOT customer.GET(customerNumber) THEN BEGIN
                                InsertCustomer(customer);
                                UpdateCustomer(GenBusPostingGroup, VATBusPostingGroup, CustomerPostingGroup, name, XMLNode, customer);
                                CreateUpdateCustomerContact(customer, customerCompanyContact);
                                IF dwCustomerNumberCustomerNo.ContainsKey(customerNumber) THEN BEGIN
                                  dwCustomerNumberCustomerNo.Remove(customerNumber);
                                  //dwCustomerNumberCustomerNo.Item(customerNumber, customer."No.");
                                  dwCustomerNumberCustomerNo.Add(customerNumber, customer."No.");
                                END  ELSE BEGIN
                                  dwCustomerNumberCustomerNo.Add(customerNumber, customer."No.");
                                END
                            END ELSE
                                GetCustomerCompanyContact(customer, customerCompanyContact);

                            IF externalUserId <> '' THEN BEGIN
                                IF contact.GET(externalUserId) THEN BEGIN
                                    contactFound := TRUE;
                                    //Update contact
                                    UpdateContact(name, XMLNode, contact);
                                    //Update contact customer reference if customer found
                                    UpdateContactCustomer(contact, customerCompanyContact);
                                    contact.MODIFY();
                                END;
                            END;
                            IF NOT contactFound THEN BEGIN
                                InsertContact(accessUserId, XMLCurrNode, customerCompanyContact, customer, contact);
                                UpdateContact(name, XMLNode, contact);
                                contact.MODIFY();
                            END;
                        END;
                    END;
                END;
            END;

          END;
      END;
      PutUserAddresses(XMLdocIn, XMLCurrNode, dwCustomerNumberCustomerNo);
      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE Add_AccessUser@1000000000(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000004 : Boolean;FilterNodes@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";importSales@1000000010 : Boolean;skipContacts@1000000011 : Boolean);
    VAR
      XMLGroupChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Customer@1000000001 : Record 18;
      Contact@1000000003 : Record 5050;
      bigtext@1000000006 : BigText;
      i@1000000008 : Integer;
      glsetup@1000 : Record 98;
      SalesPerson@1001 : Record 13;
      ContactBusiness@1000000009 : Record 5054;
      CompanyContact@1000000007 : Record 5050;
      XmlAccessUserChild@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      glsetup.GET;
      Add_Element(XMLCurrNode,'table','','',XMLGroupChild,'');
      Add_Attribute(XMLGroupChild,'tableName','AccessUserGroup');
      IF importSales THEN BEGIN
        Add_Element(XMLGroupChild,'item','','',XMLGroupChild,'');
        Add_Attribute(XMLGroupChild,'table','AccessUserGroup');
        Add_Field(XMLGroupChild,'AccessGroupGroupName','Sales');
        Add_Field(XMLGroupChild,'AccessGroupName','Sales');
        XMLGroupChild := XMLGroupChild.ParentNode;
      END;

      Add_Element(XMLGroupChild,'item','','',XMLGroupChild,'');
      Add_Attribute(XMLGroupChild,'table','AccessUserGroup');
      Add_Field(XMLGroupChild,'AccessGroupGroupName','Customers');
      Add_Field(XMLGroupChild,'AccessGroupName','Customers');
      XMLGroupChild := XMLGroupChild.ParentNode;

      Add_Element(XMLCurrNode,'table','','',XmlAccessUserChild,'');
      Add_Attribute(XmlAccessUserChild,'tableName','AccessUser');
      IF importSales THEN BEGIN
        IF (SalesPerson.FINDSET(FALSE, FALSE)) THEN BEGIN
          REPEAT
            Add_Element(XmlAccessUserChild,'item','','',XmlAccessUserChild,'');
            Add_Attribute(XmlAccessUserChild,'table','AccessUser');

            Add_Field(XmlAccessUserChild,'AccessUserUserName',SalesPerson."E-Mail");
            Add_Field(XmlAccessUserChild,'AccessUserExternalID',SalesPerson.Code);
            Add_Field(XmlAccessUserChild,'AccessUserCustomerNumber',SalesPerson.Code);
            Add_Field(XmlAccessUserChild,'AccessUserName',SalesPerson.Name);
            Add_Field(XmlAccessUserChild,'AccessUserEmail',SalesPerson."E-Mail");
            Add_Field(XmlAccessUserChild,'AccessUserPhone',SalesPerson."Phone No.");
            Add_Field(XmlAccessUserChild,'AccessUserFax','');
            Add_Field(XmlAccessUserChild,'AccessUserAddress','');
            Add_Field(XmlAccessUserChild,'AccessUserAddress2','');
            Add_Field(XmlAccessUserChild,'AccessUserZip','');
            Add_Field(XmlAccessUserChild,'AccessUserCity','');
            Add_Field(XmlAccessUserChild,'AccessUserCountry','');
            Add_Field(XmlAccessUserChild,'AccessUserCountryCode','');
            Add_Field(XmlAccessUserChild,'AccessUserAddressTitle','');
            Add_Field(XmlAccessUserChild,'AccessUserCompany','');
            Add_Field(XmlAccessUserChild,'AccessUserCurrencyCharacter','');

            Add_Field(XmlAccessUserChild,'AccessUserActive','true');
            Add_Field(XmlAccessUserChild,'AccessUserWeb','');
            Add_Field(XmlAccessUserChild,'AccessUserGroups','Sales');

            XmlAccessUserChild := XmlAccessUserChild.ParentNode;
          UNTIL SalesPerson.NEXT = 0;
        END;
      END;
      IF (NOT skipContacts) THEN BEGIN
        Contact.SETRANGE(Type, Contact.Type::Person);
        CompanyContact.SETRANGE(Type, Contact.Type::Company);
        IF Contact.FINDSET(FALSE,FALSE) THEN BEGIN
          REPEAT
            //Find Customer/Company
            ContactBusiness.SETRANGE("Contact No.", Contact."Company No.");
            IF ContactBusiness.FINDFIRST THEN BEGIN
              IF Customer.GET(ContactBusiness."No.") AND (Contact."Company Name" = Customer.Name)
                AND CompanyContact.GET(Contact."Company No.") THEN BEGIN
                Add_Element(XmlAccessUserChild,'item','','',XmlAccessUserChild,'');
                Add_Attribute(XmlAccessUserChild,'table','AccessUser');

                Add_Field(XmlAccessUserChild,'AccessUserUserName',Contact."E-Mail");
                Add_Field(XmlAccessUserChild,'AccessUserExternalID',Contact."No.");
                Add_Field(XmlAccessUserChild,'AccessUserCustomerNumber',ContactBusiness."No.");
                Add_Field(XmlAccessUserChild,'AccessUserName',Contact.Name);
                //Use company address
                Add_Field(XmlAccessUserChild,'AccessUserEmail',CompanyContact."E-Mail");
                Add_Field(XmlAccessUserChild,'AccessUserPhone',Customer."Phone No.");
                Add_Field(XmlAccessUserChild,'AccessUserFax',Customer."Fax No.");
                Add_Field(XmlAccessUserChild,'AccessUserAddress',Customer.Address);
                Add_Field(XmlAccessUserChild,'AccessUserAddress2',Customer."Address 2");
                Add_Field(XmlAccessUserChild,'AccessUserZip',Customer."Post Code");
                Add_Field(XmlAccessUserChild,'AccessUserCity',Customer.City);
                Add_Field(XmlAccessUserChild,'AccessUserCountry',Customer."Country/Region Code");
                Add_Field(XmlAccessUserChild,'AccessUserCountryCode',Customer."Country/Region Code");
                Add_Field(XmlAccessUserChild,'AccessUserAddressTitle','Company address');
                Add_Field(XmlAccessUserChild,'AccessUserCompany',Contact."Company Name");
                //
                IF Customer."Currency Code" <> '' THEN
                  Add_Field(XmlAccessUserChild,'AccessUserCurrencyCharacter',Customer."Currency Code")
                ELSE
                  Add_Field(XmlAccessUserChild,'AccessUserCurrencyCharacter',glsetup."LCY Code");

                Add_Field(XmlAccessUserChild,'AccessUserActive','true');
                Add_Field(XmlAccessUserChild,'AccessUserWeb',Contact."Home Page");
                Add_Field(XmlAccessUserChild,'AccessUserGroups','Customers');

                XmlAccessUserChild := XmlAccessUserChild.ParentNode;
              END ELSE BEGIN
                //Do not import Contact that doesn't belong to any Customer
              END;
            END;
          UNTIL Contact.NEXT=0;
        END;
      END ELSE BEGIN
        IF Customer.FINDSET(FALSE, FALSE) THEN BEGIN
            REPEAT
                Add_Element(XmlAccessUserChild, 'item', '', '', XmlAccessUserChild, '');
                Add_Attribute(XmlAccessUserChild, 'table', 'AccessUser');
                Add_Field(XmlAccessUserChild, 'AccessUserUserName', Customer."E-Mail");
                Add_Field(XmlAccessUserChild, 'AccessUserExternalID', Customer."No.");
                Add_Field(XmlAccessUserChild, 'AccessUserCustomerNumber', Customer."No.");
                Add_Field(XmlAccessUserChild, 'AccessUserName', Customer.Name);
                //Use company address
                Add_Field(XmlAccessUserChild, 'AccessUserEmail', Customer."E-Mail");
                Add_Field(XmlAccessUserChild, 'AccessUserPhone', Customer."Phone No.");
                Add_Field(XmlAccessUserChild, 'AccessUserFax', Customer."Fax No.");
                Add_Field(XmlAccessUserChild, 'AccessUserAddress', Customer.Address);
                Add_Field(XmlAccessUserChild, 'AccessUserAddress2', Customer."Address 2");
                Add_Field(XmlAccessUserChild, 'AccessUserZip', Customer."Post Code");
                Add_Field(XmlAccessUserChild, 'AccessUserCity', Customer.City);
                Add_Field(XmlAccessUserChild, 'AccessUserCountry', Customer."Country/Region Code");
                Add_Field(XmlAccessUserChild, 'AccessUserCountryCode', Customer."Country/Region Code");
                Add_Field(XmlAccessUserChild, 'AccessUserAddressTitle', 'Company address');
                Add_Field(XmlAccessUserChild, 'AccessUserCompany', Customer.Name);
                //
                IF Customer."Currency Code" <> '' THEN
                    Add_Field(XmlAccessUserChild, 'AccessUserCurrencyCharacter', Customer."Currency Code")
                ELSE
                    Add_Field(XmlAccessUserChild, 'AccessUserCurrencyCharacter', glsetup."LCY Code");

                Add_Field(XmlAccessUserChild, 'AccessUserActive', 'true');
                Add_Field(XmlAccessUserChild, 'AccessUserWeb', Customer."Home Page");
                Add_Field(XmlAccessUserChild, 'AccessUserGroups', 'Customers');
                XmlAccessUserChild := XmlAccessUserChild.ParentNode;
            UNTIL Customer.NEXT = 0;
        END;
      END;

      IF importSales THEN BEGIN
        IF skipContacts THEN
          Add_CustomersImpersonation(XMLCurrNode)
        ELSE
          Add_Impersonation(XMLCurrNode);
      END;
    END;

    LOCAL PROCEDURE Add_EcomCountries@1000000001(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000004 : Boolean;FilterNodes@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      country@1000000001 : Record 9;
      i@1000000005 : Integer;
      XmlCountryText@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN

      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomCountries');
      Add_Element(XMLCurrNode,'table','','',XmlCountryText,'');
      Add_Attribute(XmlCountryText,'tableName','EcomCountryText');

      CLEAR(country);

      IF GetAll = FALSE THEN BEGIN
        FOR i := 0 TO FilterNodes.Count() - 1 DO BEGIN
          IF country.GET(FilterNodes.Item(i).InnerText) THEN
            country.MARK(TRUE)
          ELSE
            ERROR(STRSUBSTNO('country not found %1',FilterNodes.Item(i).InnerText))
        END;
        country.MARKEDONLY(TRUE);
      END;

      IF country.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomCountries');
          Add_Field(XMLNewChild,'CountryCode2',country.Code);
          Add_Field(XMLNewChild,'CountryCultureInfo',country.Code);
          XMLNewChild := XMLNewChild.ParentNode;

          Add_Element(XmlCountryText,'item','','',XmlCountryText,'');
          Add_Attribute(XmlCountryText,'table','EcomCountryText');
          Add_Field(XmlCountryText,'CountryTextCode2',country.Code);
          Add_Field(XmlCountryText,'CountryTextLanguageId',DefaultLanguageId);
          Add_Field(XmlCountryText,'CountryTextName',country.Name);
          XmlCountryText := XmlCountryText.ParentNode;
        UNTIL country.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_EcomCurrencies@1000000007(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000004 : Boolean;FilterNodes@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      currency@1000000001 : Record 4;
      currencyExchangeRate@1000000007 : Record 330;
      i@1000000005 : Integer;
      Language@1000000006 : Record 8;
      glsetup@1000000008 : Record 98;
      glCurrencyAdded@1000000009 : Boolean;
    BEGIN

      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomCurrencies');

      glsetup.GET;
      CLEAR(currency);

      IF GetAll = FALSE THEN BEGIN
        FOR i := 0 TO FilterNodes.Count() - 1 DO BEGIN
          IF currency.GET(FilterNodes.Item(i).InnerText) THEN
            currency.MARK(TRUE)
          ELSE
            ERROR(STRSUBSTNO('currency not found %1',FilterNodes.Item(i).InnerText))
        END;
        currency.MARKEDONLY(TRUE);
      END;

      IF currency.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomCurrencies');

          Add_Field(XMLNewChild,'CurrencyCode',currency.Code);
          Add_Field(XMLNewChild,'CurrencyName',currency.Description);

          Add_Field(XMLNewChild,'CurrencyLanguageID',Language.GetUserLanguage);

          currencyExchangeRate.SETRANGE("Currency Code", currency.Code);
          currencyExchangeRate.SETRANGE("Starting Date", 0D, TODAY);
          currencyExchangeRate.SETFILTER("Exchange Rate Amount", '>0');
          IF currencyExchangeRate.FIND('+') THEN BEGIN
            Add_Field(XMLNewChild,'CurrencyRate',FORMAT(100 / currencyExchangeRate.ExchangeRate(TODAY, currency.Code)));
          END;
          IF currency.Code = glsetup."LCY Code" THEN BEGIN
              glCurrencyAdded := TRUE;
              Add_Field(XMLNewChild,'IsLCY','true');
          END ELSE BEGIN
              Add_Field(XMLNewChild,'IsLCY','false');
          END;
          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL currency.NEXT=0;
      END;
      IF NOT glCurrencyAdded THEN BEGIN
        Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
        Add_Attribute(XMLNewChild,'table','EcomCurrencies');

        Add_Field(XMLNewChild,'CurrencyCode',glsetup."LCY Code");
        Add_Field(XMLNewChild,'CurrencyName','Local');

        Add_Field(XMLNewChild,'CurrencyLanguageID',Language.GetUserLanguage);
        Add_Field(XMLNewChild,'CurrencyRate','100');
        Add_Field(XMLNewChild,'IsLCY','true');
      END;
    END;

    LOCAL PROCEDURE Add_EcomLanguages@1000000002(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000004 : Boolean;FilterNodes@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Language@1000000001 : Record 8;
      i@1000000005 : Integer;
    BEGIN

      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomLanguages');

      CLEAR(Language);

      IF GetAll = FALSE THEN BEGIN
        FOR i := 0 TO FilterNodes.Count() - 1 DO BEGIN
          IF Language.GET(FilterNodes.Item(i).InnerText) THEN
            Language.MARK(TRUE)
          ELSE
            ERROR(STRSUBSTNO('Language not found %1',FilterNodes.Item(i).InnerText))
        END;
        Language.MARKEDONLY(TRUE);
      END;

      IF Language.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomLanguages');

          Add_Field(XMLNewChild,'LanguageID',Language.Code);
          Add_Field(XMLNewChild,'LanguageCode2',Language.Code);
          Add_Field(XMLNewChild,'LanguageName',Language.Name);
          //IF Language.Code = DefaultLanguageId THEN
            //Add_Field(XMLNewChild,'LanguageIsDefault','true')
          //ELSE
            //Add_Field(XMLNewChild,'LanguageIsDefault','false');

          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL Language.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_EcomManufacturers@1000000003(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000004 : Boolean;FilterNodes@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      vendor@1000000001 : Record 23;
      i@1000000005 : Integer;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomManufacturers');

      CLEAR(vendor);

      IF GetAll = FALSE THEN BEGIN

        FOR i := 0 TO FilterNodes.Count() - 1 DO BEGIN
          IF vendor.GET(FilterNodes.Item(i).InnerText) THEN
            vendor.MARK(TRUE)
          ELSE
            ERROR(STRSUBSTNO('vendor not found %1',FilterNodes.Item(i).InnerText))
        END;
        vendor.MARKEDONLY(TRUE);
      END;

      IF vendor.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomManufacturers');

          Add_Field(XMLNewChild,'ManufacturerID',vendor."No.");
          Add_Field(XMLNewChild,'ManufacturerName',vendor.Name);
          Add_Field(XMLNewChild,'ManufacturerAddress',vendor.Address);
          Add_Field(XMLNewChild,'ManufacturerZipCode',vendor."Post Code");
          Add_Field(XMLNewChild,'ManufacturerCity',vendor.City);
          Add_Field(XMLNewChild,'ManufacturerCountry',vendor."Country/Region Code");
          Add_Field(XMLNewChild,'ManufacturerPhone',vendor."Phone No.");
          Add_Field(XMLNewChild,'ManufacturerFax',vendor."Fax No.");
          Add_Field(XMLNewChild,'ManufacturerEmail',vendor."E-Mail");
          Add_Field(XMLNewChild,'ManufacturerWeb',vendor."Home Page");

          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL vendor.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_EcomProducts@1000000004(XMLdocIn@1000000020 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";importProperties@1000000023 : Boolean);
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000002 : Record 27;
      i@1000000014 : Integer;
      DynamicwebCounter@1000000003 : Record 50099;
      pageSize@1000000009 : Integer;
      CustomModifier@1000000004 : Text;
      itemAttributesList@1000000017 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";
      XMLNewChildProductCategoryFieldValue@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategoryField@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategoryFieldTranslation@1000000010 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategoryFieldOption@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategoryFieldOptionTranslation@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategory@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildProductCategoryTranslation@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      languagesList@1000000013 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";
      setLanguage@1000000015 : Text;
      groupId@1000000016 : Text;
      shopId@1000000018 : Text;
      XMLNewChildGroupProductRelation@1000000019 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildShopGroupRelation@1000000021 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      setLanguage := Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@setLanguage');
      IF setLanguage = '' THEN
        setLanguage := Get_TextFromNode(XMLdocIn, '/GetAllEcomData/@setLanguage');
      IF setLanguage = '' THEN
        ERROR('setLanguage attribute must be set in the request');

      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomProducts');
      IF importProperties THEN BEGIN
        itemAttributesList := itemAttributesList.List();
      END;
      Get_RequestLanguages(Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/Products/@languages'), languagesList);
      groupId := Get_TextFromNode(XMLdocIn,'/GetEcomData/@groupID');
      shopId := Get_TextFromNode(XMLdocIn,'/GetEcomData/@shopID');
      IF shopId = '' THEN
        shopId := Get_TextFromNode(XMLdocIn, '/GetAllEcomData/@shopID');
      IF groupId <> '' THEN BEGIN
        Add_Element(XMLCurrNode,'table','','',XMLNewChildGroupProductRelation,'');
        Add_Attribute(XMLNewChildGroupProductRelation,'tableName','EcomGroupProductRelation');
        IF shopId <> '' THEN BEGIN
          Add_Element(XMLCurrNode,'table','','',XMLNewChildShopGroupRelation,'');
          Add_Attribute(XMLNewChildShopGroupRelation,'tableName','EcomShopGroupRelation');
          Add_Element(XMLNewChildShopGroupRelation,'item','','',XMLNewChildShopGroupRelation,'');
          Add_Attribute(XMLNewChildShopGroupRelation,'table','EcomShopGroupRelation');
          Add_Field(XMLNewChildShopGroupRelation,'ShopGroupShopID',shopId);
          Add_Field(XMLNewChildShopGroupRelation,'ShopGroupGroupID',groupId);
        END;
      END;

      IF Get_TextFromNode(XMLdocIn.DocumentElement,'/GetEcomData/@Qty') <> '' THEN BEGIN
        pageSize := TextToInteger(Get_TextFromNode(XMLdocIn.DocumentElement,'/GetEcomData/@Qty'));
        IF pageSize > 0 THEN BEGIN
          CustomModifier := Get_TextFromNode(XMLdocIn.DocumentElement,'/GetEcomData/@CustomModifier');
          DynamicwebCounter.SETRANGE(MethodIdentifier, 'Add_EcomProducts');
          DynamicwebCounter.SETRANGE(CustomIdentifier, CustomModifier);
          IF DynamicwebCounter.FIND('-') THEN BEGIN
            IF Get_BoolFromNode(XMLdocIn,'/GetEcomData/@ReimportTable') THEN BEGIN
              DynamicwebCounter.LastId := '';
            END;
            DynamicwebCounter.BatchSize := pageSize;
            DynamicwebCounter.LastRequest := CURRENTDATETIME;
            DynamicwebCounter.MODIFY;
          END ELSE BEGIN
            DynamicwebCounter.MethodIdentifier := 'Add_EcomProducts';
            DynamicwebCounter.CustomIdentifier := CustomModifier;
            DynamicwebCounter.BatchSize := pageSize;
            DynamicwebCounter.LastRequest := CURRENTDATETIME;
            DynamicwebCounter.LastId := '';
            DynamicwebCounter.INSERT;
          END;
          IF DynamicwebCounter.LastId <> '' THEN BEGIN
            item.SETFILTER("No.", '>%1', FORMAT(DynamicwebCounter.LastId));
          END;

          IF item.FINDSET(FALSE,FALSE) THEN BEGIN
            REPEAT
              i := i + 1;
              DynamicwebCounter.LastId := item."No.";
              Add_EcomProduct(item, XMLNewChild, languagesList, setLanguage);
              IF importProperties THEN BEGIN
                Add_ProductProperties(item, XMLNewChild, itemAttributesList, XMLCurrNode, XMLNewChildProductCategoryFieldValue, XMLNewChildProductCategoryField, XMLNewChildProductCategoryFieldTranslation,
                  XMLNewChildProductCategoryFieldOption, XMLNewChildProductCategoryFieldOptionTranslation, XMLNewChildProductCategory, XMLNewChildProductCategoryTranslation, languagesList, setLanguage);
              END;
              IF groupId <> '' THEN
                Add_ProductDefaultGroup(groupId, item."No.", XMLNewChildGroupProductRelation);
            UNTIL (item.NEXT = 0) OR (i >= pageSize);
            DynamicwebCounter.MODIFY;
          END;
        END;
      END ELSE BEGIN
        IF item.FINDSET(FALSE,FALSE) THEN BEGIN
          REPEAT
            Add_EcomProduct(item, XMLNewChild, languagesList, setLanguage);
            IF importProperties THEN BEGIN
              Add_ProductProperties(item, XMLNewChild, itemAttributesList, XMLCurrNode, XMLNewChildProductCategoryFieldValue, XMLNewChildProductCategoryField, XMLNewChildProductCategoryFieldTranslation,
                  XMLNewChildProductCategoryFieldOption, XMLNewChildProductCategoryFieldOptionTranslation, XMLNewChildProductCategory, XMLNewChildProductCategoryTranslation, languagesList, setLanguage);
            END;
            IF groupId <> '' THEN
                Add_ProductDefaultGroup(groupId, item."No.", XMLNewChildGroupProductRelation);
          UNTIL item.NEXT=0;
        END;
      END;
    END;

    LOCAL PROCEDURE Add_EcomProduct@1000000045(item@1000000002 : Record 27;XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";languagesList@1000000000 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";setLanguage@1000000003 : Text);
    VAR
      itemvariants@1000000006 : Record 5401;
      itemtranslations@1000000007 : Record 30;
      numberofvariants@1000000005 : Integer;
      i@1000000004 : Integer;
    BEGIN
      itemvariants.SETFILTER(itemvariants."Item No.",'=%1',item."No.");
      IF itemvariants.FINDSET(FALSE,FALSE) THEN BEGIN
          numberofvariants := itemvariants.COUNT;
      END ELSE BEGIN
          numberofvariants := 0;
      END;

      itemtranslations.SETFILTER("Item No.",'=%1',item."No.");
      itemtranslations.SETFILTER("Language Code",'=%1',setLanguage);
      itemtranslations.SETRANGE("Variant Code",'');
      IF itemtranslations.FINDFIRST THEN BEGIN
        Add_Item(item,XMLNewChild,setLanguage,'',numberofvariants,itemtranslations.Description,itemtranslations."Description 2");
      END ELSE BEGIN
        Add_Item(item,XMLNewChild,setLanguage,'',numberofvariants,item.Description,item."Description 2");
      END;

      IF languagesList.Count > 0 THEN BEGIN
        FOR i := 0 TO languagesList.Count - 1 DO BEGIN
          IF LOWERCASE(FORMAT(languagesList.Item(i))) <> LOWERCASE(setLanguage) THEN BEGIN
            itemtranslations.SETFILTER("Language Code", languagesList.Item(i));
            IF itemtranslations.FINDFIRST() THEN BEGIN
              Add_Item(item,XMLNewChild,itemtranslations."Language Code",'',numberofvariants,itemtranslations.Description,itemtranslations."Description 2");
            END;
          END;
        END;
      END;
      IF numberofvariants > 0 THEN BEGIN
          REPEAT
          CLEAR(itemtranslations);
          itemtranslations.SETFILTER("Item No.",'=%1', item."No.");
          itemtranslations.SETFILTER("Language Code",'=%1', setLanguage);
          itemtranslations.SETFILTER("Variant Code",'=%1', itemvariants.Code);
          IF itemtranslations.FINDFIRST THEN BEGIN
            Add_Item(item,XMLNewChild,setLanguage,itemvariants.Code,numberofvariants,itemtranslations.Description,itemtranslations."Description 2");
          END ELSE BEGIN
            Add_Item(item,XMLNewChild,setLanguage,itemvariants.Code,numberofvariants,itemvariants.Description,itemvariants."Description 2");
          END;
          IF languagesList.Count > 0 THEN BEGIN
            FOR i := 0 TO languagesList.Count - 1 DO BEGIN
              IF LOWERCASE(FORMAT(languagesList.Item(i))) <> LOWERCASE(setLanguage) THEN BEGIN
                itemtranslations.SETFILTER("Language Code", languagesList.Item(i));
                IF itemtranslations.FINDFIRST() THEN BEGIN
                  Add_Item(item,XMLNewChild,itemtranslations."Language Code",itemvariants.Code,numberofvariants,itemtranslations.Description,itemtranslations."Description 2");
                END;
              END;
            END;
          END;
          UNTIL itemvariants.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_ProductCategoryAndFieldsXmlNodes@1000000047(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategory@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryTranslation@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryField@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldTranslation@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOption@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOptionTranslation@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldValue@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";languagesList@1000000002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";setLanguage@1000000004 : Text);
    VAR
      i@1000000003 : Integer;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategory,'');
      Add_Attribute(XMLNewChildProductCategory,'tableName','EcomProductCategory');
      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryTranslation,'');
      Add_Attribute(XMLNewChildProductCategoryTranslation,'tableName','EcomProductCategoryTranslation');

      Add_Element(XMLNewChildProductCategory,'item','','',XMLNewChildProductCategory,'');
      Add_Attribute(XMLNewChildProductCategory,'table','EcomProductCategory');
      Add_Field(XMLNewChildProductCategory,'CategoryId', 'ImportedNAVItemAttributes');
      Add_Field(XMLNewChildProductCategory,'CategoryType', '1');
      Add_Field(XMLNewChildProductCategory,'CategoryProductProperties', 'true');

      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryField,'');
      Add_Attribute(XMLNewChildProductCategoryField,'tableName','EcomProductCategoryField');
      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryFieldTranslation,'');
      Add_Attribute(XMLNewChildProductCategoryFieldTranslation,'tableName','EcomProductCategoryFieldTranslation');
      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryFieldOption,'');
      Add_Attribute(XMLNewChildProductCategoryFieldOption,'tableName','EcomFieldOption');
      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryFieldOptionTranslation,'');
      Add_Attribute(XMLNewChildProductCategoryFieldOptionTranslation,'tableName','EcomFieldOptionTranslation');

      Add_Element(XMLCurrNode,'table','','',XMLNewChildProductCategoryFieldValue,'');
      Add_Attribute(XMLNewChildProductCategoryFieldValue,'tableName','EcomProductCategoryFieldValue');

      Add_Element(XMLNewChildProductCategoryTranslation,'item','','',XMLNewChildProductCategoryTranslation,'');
      Add_Attribute(XMLNewChildProductCategoryTranslation,'table','EcomProductCategoryTranslation');
      Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationCategoryId', 'ImportedNAVItemAttributes');
      Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationLanguageId', setLanguage);
      Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationCategoryName', 'Imported NAV Item Attributes');
      XMLNewChildProductCategoryTranslation := XMLNewChildProductCategoryTranslation.ParentNode;

      IF languagesList.Count > 0 THEN BEGIN
        FOR i := 0 TO languagesList.Count - 1 DO BEGIN
          IF LOWERCASE(FORMAT(languagesList.Item(i))) <> LOWERCASE(setLanguage) THEN BEGIN
            Add_Element(XMLNewChildProductCategoryTranslation,'item','','',XMLNewChildProductCategoryTranslation,'');
            Add_Attribute(XMLNewChildProductCategoryTranslation,'table','EcomProductCategoryTranslation');
            Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationCategoryId', 'ImportedNAVItemAttributes');
            Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationLanguageId', languagesList.Item(i));
            Add_Field(XMLNewChildProductCategoryTranslation,'CategoryTranslationCategoryName', 'Imported NAV Item Attributes');
            XMLNewChildProductCategoryTranslation := XMLNewChildProductCategoryTranslation.ParentNode;
          END;
        END;
      END;
    END;

    LOCAL PROCEDURE Add_EcomGroups@1000000043(XMLdocIn@1000000020 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChildGroupProductRelation@1000000010 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000002 : Record 27;
      shopId@1000000001 : Text;
    BEGIN
      shopId := Get_TextFromNode(XMLdocIn.DocumentElement, '/GetEcomData/@shopID');
      IF shopId = '' THEN
        shopId := Get_TextFromNode(XMLdocIn.DocumentElement, '/GetAllEcomData/@shopID');
      Add_EcomProductCategories(XMLdocIn, XMLCurrNode, shopId);
      Add_Element(XMLCurrNode,'table','','',XMLNewChildGroupProductRelation,'');
      Add_Attribute(XMLNewChildGroupProductRelation,'tableName','EcomGroupProductRelation');
      IF item.FINDSET(FALSE,FALSE) THEN BEGIN
          REPEAT
          IF item."Item Category Code" <> '' THEN BEGIN
            Add_Element(XMLNewChildGroupProductRelation,'item','','',XMLNewChildGroupProductRelation,'');
            Add_Attribute(XMLNewChildGroupProductRelation,'table','EcomGroupProductRelation');
            Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationGroupID',item."Item Category Code");
            Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationProductID',item."No.");
            Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationIsPrimary','True');
            XMLNewChildGroupProductRelation := XMLNewChildGroupProductRelation.ParentNode;
          END;
          UNTIL item.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_EcomProductCategories@1000000026(XMLdocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";shopId@1000000004 : Text);
    VAR
      XMLNewChildGroupProductGroups@1000000018 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildShopGroupRelation@1000000021 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildGroupRelation@1000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      ItemCategory@1001 : Record 5722;
      languagesList@1000000003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";
      i@1000000002 : Integer;
      setLanguage@1000000022 : Text;
    BEGIN
      setLanguage := Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/ProductGroups/@setLanguage');
      IF setLanguage = '' THEN
        setLanguage := Get_TextFromNode(XMLdocIn,'/GetAllEcomData/@setLanguage');
      IF setLanguage = '' THEN
        ERROR('setLanguage attribute must be set in the request');

      Add_Element(XMLCurrNode,'table','','',XMLNewChildGroupProductGroups,'');
      Add_Attribute(XMLNewChildGroupProductGroups,'tableName','EcomGroups');

      Add_Element(XMLCurrNode,'table','','',XMLNewChildShopGroupRelation,'');
      Add_Attribute(XMLNewChildShopGroupRelation,'tableName','EcomShopGroupRelation');

      Add_Element(XMLCurrNode,'table','','',XMLNewChildGroupRelation,'');
      Add_Attribute(XMLNewChildGroupRelation,'tableName','EcomGroupRelations');

      Get_RequestLanguages(Get_TextFromNode(XMLdocIn,'/GetEcomData/tables/ProductGroups/@languages'), languagesList);
      //Add Item Categories as product groups
      IF ItemCategory.FINDSET(FALSE, FALSE) THEN
      REPEAT
        Add_Element(XMLNewChildShopGroupRelation,'item','','',XMLNewChildShopGroupRelation,'');
        Add_Attribute(XMLNewChildShopGroupRelation,'table','EcomShopGroupRelation');
        Add_Field(XMLNewChildShopGroupRelation,'ShopGroupShopID', shopId);
        Add_Field(XMLNewChildShopGroupRelation,'ShopGroupGroupID', ItemCategory.Code);
        XMLNewChildShopGroupRelation := XMLNewChildShopGroupRelation.ParentNode;

        Add_Element(XMLNewChildGroupProductGroups,'item','','',XMLNewChildGroupProductGroups,'');
        Add_Attribute(XMLNewChildGroupProductGroups,'table','EcomGroups');
        Add_Field(XMLNewChildGroupProductGroups,'GroupID',ItemCategory.Code);
        Add_Field(XMLNewChildGroupProductGroups,'GroupLanguageID',setLanguage);
        IF ItemCategory.Description = '' THEN BEGIN
            Add_Field(XMLNewChildGroupProductGroups,'GroupName', ItemCategory.Code);
        END ELSE BEGIN
            Add_Field(XMLNewChildGroupProductGroups,'GroupName', ItemCategory.Description);
        END;
        Add_Field(XMLNewChildGroupProductGroups,'GroupInheritCategoryFieldsFromParent','true');
        XMLNewChildGroupProductGroups := XMLNewChildGroupProductGroups.ParentNode;

        IF languagesList.Count > 0 THEN BEGIN
          FOR i := 0 TO languagesList.Count - 1 DO BEGIN
            IF FORMAT(languagesList.Item(i)) <> setLanguage THEN BEGIN
              Add_Element(XMLNewChildGroupProductGroups,'item','','',XMLNewChildGroupProductGroups,'');
              Add_Attribute(XMLNewChildGroupProductGroups,'table','EcomGroups');
              Add_Field(XMLNewChildGroupProductGroups,'GroupID',ItemCategory.Code);
              Add_Field(XMLNewChildGroupProductGroups,'GroupLanguageID',languagesList.Item(i));
              Add_Field(XMLNewChildGroupProductGroups,'GroupName', STRSUBSTNO('%1_%2_NotTranslated', ItemCategory.Code, languagesList.Item(i)));
              Add_Field(XMLNewChildGroupProductGroups,'GroupInheritCategoryFieldsFromParent','true');
              XMLNewChildGroupProductGroups := XMLNewChildGroupProductGroups.ParentNode;
            END;
          END;
        END;

        IF ItemCategory."Parent Category" <> '' THEN BEGIN
          Add_Element(XMLNewChildGroupRelation,'item','','',XMLNewChildGroupRelation,'');
          Add_Attribute(XMLNewChildGroupRelation,'table','EcomGroupRelations');
          Add_Field(XMLNewChildGroupRelation,'GroupRelationsGroupID',ItemCategory.Code);
          Add_Field(XMLNewChildGroupRelation,'GroupRelationsParentID',ItemCategory."Parent Category");
          Add_Field(XMLNewChildGroupRelation,'GroupRelationsSorting',FORMAT(ItemCategory."Presentation Order" - ItemCategory.Indentation));
          XMLNewChildGroupRelation := XMLNewChildGroupRelation.ParentNode;
        END;
      UNTIL ItemCategory.NEXT=0;
    END;

    LOCAL PROCEDURE Add_EcomProductCategoryField@1000000028(VAR ItemAttributes@1000000026 : Record 7500;ItemAttributeValueMappingValueId@1000000030 : Integer;XMLNewChildProductCategoryField@1000000032 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldTranslation@1000000033 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOption@1000000034 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOptionTranslation@1000000035 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";ItemCategoryCode@100000000 : Text;languagesList@1000000002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";setLanguage@1000000004 : Text);
    VAR
      ItemAttributeValues@1000000027 : Record 7501;
      ItemAttributeTranslation@1000000028 : Record 7502;
      ItemAttributeValueTranslation@1000000029 : Record 7503;
      optionsText@1000000000 : BigText;
      defaultOptionsText@1000000001 : BigText;
      i@1000000003 : Integer;
    BEGIN
        IF NOT languagesList.Contains(setLanguage) THEN
          languagesList.Add(setLanguage);

        Add_Element(XMLNewChildProductCategoryField,'item','','',XMLNewChildProductCategoryField,'');
        Add_Attribute(XMLNewChildProductCategoryField,'table','EcomProductCategoryField');
        Add_Field(XMLNewChildProductCategoryField,'FieldId', ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID));
        Add_Field(XMLNewChildProductCategoryField,'FieldCategoryId', ItemCategoryCode);
        Add_Field(XMLNewChildProductCategoryField,'FieldTemplateTag', ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID));
        CASE ItemAttributes.Type OF
          ItemAttributes.Type::Text:
              Add_Field(XMLNewChildProductCategoryField,'FieldType', '1');
          ItemAttributes.Type::Integer:
              Add_Field(XMLNewChildProductCategoryField,'FieldType', '6');
          ItemAttributes.Type::Decimal:
              Add_Field(XMLNewChildProductCategoryField,'FieldType', '7');
          ItemAttributes.Type::Option:
              Add_Field(XMLNewChildProductCategoryField,'FieldType', '15');
          ELSE
              Add_Field(XMLNewChildProductCategoryField,'FieldType', '1');
        END;
        CLEAR(ItemAttributeValues);
        ItemAttributeValues.SETFILTER(ID, FORMAT(ItemAttributeValueMappingValueId));
        ItemAttributeValues.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
        IF ItemAttributeValues.FINDFIRST THEN BEGIN
          IF ItemAttributes.Type = ItemAttributes.Type::Option THEN
            Add_Field(XMLNewChildProductCategoryField,'FieldDefaultValue', FORMAT(ItemAttributeValues.ID))
          ELSE
            Add_Field(XMLNewChildProductCategoryField,'FieldDefaultValue', ItemAttributeValues.Value);
        END ELSE BEGIN
          Add_Field(XMLNewChildProductCategoryField,'FieldDefaultValue', '');
        END;
        Add_Field(XMLNewChildProductCategoryField,'FieldPresentationType','1');
        Add_Field(XMLNewChildProductCategoryField,'FieldDoNotRender','false');
        Add_Field(XMLNewChildProductCategoryField,'FieldHideEmpty','false');
        XMLNewChildProductCategoryField := XMLNewChildProductCategoryField.ParentNode;

        IF ItemAttributes.Type = ItemAttributes.Type::Option THEN BEGIN
          CLEAR(ItemAttributeValues);
          ItemAttributeValues.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
          //<Options><Option Name="n1" Value="123" Default="" /></Options>
          defaultOptionsText.ADDTEXT('<Options>');
          IF ItemAttributeValues.FINDSET(FALSE, FALSE) THEN BEGIN
            REPEAT
              Add_Element(XMLNewChildProductCategoryFieldOption,'item','','',XMLNewChildProductCategoryFieldOption,'');
              Add_Attribute(XMLNewChildProductCategoryFieldOption,'table','EcomFieldOption');
              Add_Field(XMLNewChildProductCategoryFieldOption,'FieldOptionId',ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID) + '_'+ FORMAT(ItemAttributeValues.ID));
              Add_Field(XMLNewChildProductCategoryFieldOption,'FieldOptionFieldId',ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID));
              Add_Field(XMLNewChildProductCategoryFieldOption,'FieldOptionName',ItemAttributeValues.Value);
              Add_Field(XMLNewChildProductCategoryFieldOption,'FieldOptionValue',FORMAT(ItemAttributeValues.ID));
              //FieldOptionIsDefault
              XMLNewChildProductCategoryFieldOption := XMLNewChildProductCategoryFieldOption.ParentNode;

              //add def language
              CLEAR(ItemAttributeValueTranslation);
              ItemAttributeValueTranslation.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
              ItemAttributeValueTranslation.SETFILTER("Language Code", '=%1', setLanguage);
              ItemAttributeValueTranslation.SETFILTER(ID, FORMAT(ItemAttributeValues.ID));
              IF NOT ItemAttributeValueTranslation.FINDFIRST THEN BEGIN
                  Add_Element(XMLNewChildProductCategoryFieldOptionTranslation,'item','','',XMLNewChildProductCategoryFieldOptionTranslation,'');
                  Add_Attribute(XMLNewChildProductCategoryFieldOptionTranslation,'table','EcomFieldOptionTranslation');
                  //Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationID',FORMAT(ItemAttributeValueTranslation.ID));
                  Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationOptionID',ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID) + '_'+ FORMAT(ItemAttributeValues.ID));
                  Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationLanguageID', setLanguage);
                  Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationName',ItemAttributeValues.Value);
                  XMLNewChildProductCategoryFieldOptionTranslation := XMLNewChildProductCategoryFieldOptionTranslation.ParentNode;
                  defaultOptionsText.ADDTEXT('<Option Name="' + ReplaceInvalidXMLCharacters(ItemAttributeValues.Value) +'" Value="' + FORMAT(ItemAttributeValues.ID) + '" Default="" />');
              END ELSE BEGIN
                defaultOptionsText.ADDTEXT('<Option Name="' + ReplaceInvalidXMLCharacters(ItemAttributeValueTranslation.Name) +'" Value="' + FORMAT(ItemAttributeValues.ID) + '" Default="" />');
              END;
            UNTIL ItemAttributeValues.NEXT=0;
          END;
          defaultOptionsText.ADDTEXT('</Options>');

          CLEAR(ItemAttributeValueTranslation);
          ItemAttributeValueTranslation.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
          IF ItemAttributeValueTranslation.FINDSET(FALSE, FALSE) THEN BEGIN
            REPEAT
              IF languagesList.Contains(ItemAttributeValueTranslation."Language Code") THEN BEGIN
                Add_Element(XMLNewChildProductCategoryFieldOptionTranslation,'item','','',XMLNewChildProductCategoryFieldOptionTranslation,'');
                Add_Attribute(XMLNewChildProductCategoryFieldOptionTranslation,'table','EcomFieldOptionTranslation');
                //Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationID',FORMAT(ItemAttributeValueTranslation.ID));
                Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationOptionID',ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID) + '_'+ FORMAT(ItemAttributeValueTranslation.ID));
                Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationLanguageID',ItemAttributeValueTranslation."Language Code");
                Add_Field(XMLNewChildProductCategoryFieldOptionTranslation,'EcomFieldOptionTranslationName',ItemAttributeValueTranslation.Name);
                XMLNewChildProductCategoryFieldOptionTranslation := XMLNewChildProductCategoryFieldOptionTranslation.ParentNode;
              END;
            UNTIL ItemAttributeValueTranslation.NEXT=0;
          END;

          FOR i := 0 TO languagesList.Count - 1 DO BEGIN
            CLEAR(ItemAttributeTranslation);
            ItemAttributeTranslation.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
            ItemAttributeTranslation.SETFILTER("Language Code", '=%1', FORMAT(languagesList.Item(i)));
            IF ItemAttributeTranslation.FINDFIRST() THEN BEGIN
              optionsText.ADDTEXT('<Options>');
              IF ItemAttributeValues.FINDSET(FALSE, FALSE) THEN BEGIN
                REPEAT
                  CLEAR(ItemAttributeValueTranslation);
                  ItemAttributeValueTranslation.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
                  ItemAttributeValueTranslation.SETFILTER("Language Code", '=%1', FORMAT(languagesList.Item(i)));
                  ItemAttributeValueTranslation.SETFILTER(ID, FORMAT(ItemAttributeValues.ID));
                  IF NOT ItemAttributeValueTranslation.FINDFIRST THEN BEGIN
                    optionsText.ADDTEXT('<Option Name="' + ReplaceInvalidXMLCharacters(ItemAttributeValues.Value) +'" Value="' + FORMAT(ItemAttributeValues.ID) + '" Default="" />');
                  END ELSE BEGIN
                    optionsText.ADDTEXT('<Option Name="' + ReplaceInvalidXMLCharacters(ItemAttributeValueTranslation.Name) +'" Value="' + FORMAT(ItemAttributeValues.ID) + '" Default="" />');
                  END;
                UNTIL ItemAttributeValues.NEXT=0;
              END;
              optionsText.ADDTEXT('</Options>');
              Add_EcomProductCategoryFieldOptionTranslation(ItemAttributes,FORMAT(languagesList.Item(i)),XMLNewChildProductCategoryFieldTranslation,ItemCategoryCode,optionsText,ItemAttributeTranslation.Name);
            END ELSE BEGIN
              IF LOWERCASE(FORMAT(languagesList.Item(i))) = LOWERCASE(setLanguage) THEN
                Add_EcomProductCategoryFieldOptionTranslation(ItemAttributes,setLanguage,XMLNewChildProductCategoryFieldTranslation,ItemCategoryCode,defaultOptionsText,ItemAttributes.Name);
            END;
          END;

        END ELSE BEGIN
          defaultOptionsText.ADDTEXT('<Options />');
          //other language option translation
          FOR i := 0 TO languagesList.Count - 1 DO BEGIN
            CLEAR(ItemAttributeTranslation);
            ItemAttributeTranslation.SETFILTER("Attribute ID", FORMAT(ItemAttributes.ID));
            ItemAttributeTranslation.SETFILTER("Language Code", '=%1', FORMAT(languagesList.Item(i)));
            IF ItemAttributeTranslation.FINDFIRST() THEN
              Add_EcomProductCategoryFieldOptionTranslation(ItemAttributes,FORMAT(languagesList.Item(i)),XMLNewChildProductCategoryFieldTranslation,ItemCategoryCode,defaultOptionsText,ItemAttributeTranslation.Name)
            ELSE
              IF LOWERCASE(FORMAT(languagesList.Item(i))) = LOWERCASE(setLanguage) THEN
                Add_EcomProductCategoryFieldOptionTranslation(ItemAttributes,setLanguage,XMLNewChildProductCategoryFieldTranslation,ItemCategoryCode,defaultOptionsText,ItemAttributes.Name);
          END;
        END;
    END;

    LOCAL PROCEDURE Add_EcomProductCategoryFieldOptionTranslation@1000000029(VAR ItemAttributes@1000000026 : Record 7500;languageId@1000000030 : Text;XMLNewChildProductCategoryFieldTranslation@1000000033 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";ItemCategoryCode@100000000 : Text;options@100000001 : BigText;label@1000000000 : Text);
    BEGIN
        Add_Element(XMLNewChildProductCategoryFieldTranslation,'item','','',XMLNewChildProductCategoryFieldTranslation,'');
        Add_Attribute(XMLNewChildProductCategoryFieldTranslation,'table','EcomProductCategoryFieldTranslation');
        Add_Field(XMLNewChildProductCategoryFieldTranslation,'FieldTranslationFieldId',ItemCategoryCode + '_' + FORMAT(ItemAttributes.ID));
        Add_Field(XMLNewChildProductCategoryFieldTranslation,'FieldTranslationFieldCategoryId',ItemCategoryCode);
        Add_Field(XMLNewChildProductCategoryFieldTranslation,'FieldTranslationLanguageId',languageId);
        Add_Field(XMLNewChildProductCategoryFieldTranslation,'FieldTranslationFieldLabel',label);
        Add_FieldBigText(XMLNewChildProductCategoryFieldTranslation,'FieldTranslationFieldOptions',options);
        XMLNewChildProductCategoryFieldTranslation := XMLNewChildProductCategoryFieldTranslation.ParentNode;
    END;

    LOCAL PROCEDURE Add_Item@1000000016(item@1000000000 : Record 27;VAR XMLNewChildProd@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";language@1000000001 : Text;variant@1000000003 : Text[30];variantcount@1000000006 : Integer;description1@1000000004 : Text[255];description2@1000000005 : Text[255]);
    VAR
      Languages@1000000007 : Record 8;
      itemIdentifier@1000000008 : Record 7704;
      itemLedgerEntry@1000000009 : Record 32;
    BEGIN
      item."Variant Filter" := variant;
      item.CALCFIELDS(item.Inventory);
      Add_Element(XMLNewChildProd,'item','','',XMLNewChildProd,'');
      Add_Attribute(XMLNewChildProd,'table','EcomProducts');
      Add_Field(XMLNewChildProd,'ProductID',item."No.");

      IF (language <> '') THEN
        Add_Field(XMLNewChildProd,'ProductLanguageID',language)
      ELSE
        Add_Field(XMLNewChildProd,'ProductLanguageID',Languages.GetUserLanguage);

      IF (variant <> '') THEN
        Add_Field(XMLNewChildProd,'ProductVariantID',variant)
      ELSE
        Add_Field(XMLNewChildProd,'ProductVariantID','');

      Add_Field(XMLNewChildProd,'ProductNumber',item."No.");
      Add_Field(XMLNewChildProd,'ProductName',description1);
      Add_Field(XMLNewChildProd,'ProductShortDescription',description2);
      Add_Field(XMLNewChildProd,'ProductPrice',FORMAT(item."Unit Price"));

      IF (variant <> '') THEN BEGIN
        itemLedgerEntry.SETFILTER("Item No.", '=%1', item."No.");
        itemLedgerEntry.SETFILTER("Variant Code", '=%1', variant);
        itemLedgerEntry.CALCSUMS(Quantity);
        Add_Field(XMLNewChildProd,'ProductStock',FORMAT(itemLedgerEntry.Quantity));
      END ELSE BEGIN
        Add_Field(XMLNewChildProd,'ProductStock',FORMAT(item.Inventory));
      END;

      Add_Field(XMLNewChildProd,'ProductWeight',FORMAT(item."Net Weight"));
      Add_Field(XMLNewChildProd,'ProductVolume',FORMAT(item."Unit Volume"));
      Add_Field(XMLNewChildProd,'ProductManufacturerID',item."Vendor No.");
      IF (item.Blocked = TRUE) THEN
        Add_Field(XMLNewChildProd,'ProductActive','false')
      ELSE
        Add_Field(XMLNewChildProd,'ProductActive','true');

      Add_Field(XMLNewChildProd,'ProductVariantCounter',FORMAT(variantcount)); //antal af vaianter;
      Add_Field(XMLNewChildProd,'ProductDefaultUnitID',STRSUBSTNO('Unit_%1',item."Base Unit of Measure"));
      itemIdentifier.SETFILTER("Item No.", '=%1', item."No.");
      itemIdentifier.SETFILTER("Variant Code", '=%1', variant);
      IF itemIdentifier.FINDFIRST() THEN BEGIN
        Add_Field(XMLNewChildProd,'ProductEAN',itemIdentifier.Code);
      END ELSE BEGIN
        Add_Field(XMLNewChildProd,'ProductEAN',item."Identifier Code");
      END;

      XMLNewChildProd := XMLNewChildProd.ParentNode;
    END;

    LOCAL PROCEDURE Add_EcomProductsCustomer@1000000021(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1000000013 : Boolean;CustomerNo@1000000010 : Text;FilterNodes@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";getUnitPrices@1000000021 : Boolean);
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000002 : Record 27;
      itemvariants@1000000006 : Record 5401;
      itemtranslations@1000000007 : Record 30;
      numberofitems@1000000003 : Integer;
      numberoftranslations@1000000004 : Integer;
      numberofvariants@1000000005 : Integer;
      UnitofMeasure@1000000008 : Record 204;
      unitofmeasuretranslation@1000000009 : Record 5402;
      i@1000000014 : Integer;
      ItemNode@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      LanguageNode@1000000016 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Language@1000000017 : Record 8;
      customer@1000000018 : Record 18;
      CurrExchRate@1000000019 : Record 330;
      XMLNewChildTemp@1000000020 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChildUOMPrices@1000000022 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomProducts');
      IF getUnitPrices THEN BEGIN
        Add_Element(XMLCurrNode,'table','','',XMLNewChildUOMPrices,'');
        Add_Attribute(XMLNewChildUOMPrices,'tableName','EcomPrices');
      END;

      GetCustomer(CustomerNo, customer);
      IF (customer."Bill-to Customer No." <> '') THEN BEGIN
        customer.GET(customer."Bill-to Customer No.");
      END;

      IF (FilterNodes.Count() >= 1) THEN BEGIN
         ExchRateDate := TODAY;
         GLSetup.GET;
         IF (Currency.GET(Get_TextFromNode(FilterNodes.Item(0),'CurrencyCode'))) THEN BEGIN
           Currency.SETRECFILTER();
           CurrencyFactor := CurrExchRate.ExchangeRate(ExchRateDate,Currency.Code);
         END ELSE BEGIN
         CurrencyFactor := 1;
         END;
      END;

      IF GetAll = FALSE THEN BEGIN

        FOR i := 0 TO FilterNodes.Count() - 1 DO BEGIN
          IF ISNULL(FilterNodes.Item(i)) THEN
            ERROR ('Node not found');

          XMLNewChildTemp := FilterNodes.Item(i).SelectSingleNode('ProductID');
          IF ISNULL(XMLNewChildTemp) THEN
            XMLNewChildTemp := FilterNodes.Item(i).SelectSingleNode('ProductId');

          IF ISNULL(XMLNewChildTemp) THEN
            ERROR ('ProductId node not found in the request');

          IF XMLNewChildTemp.InnerText <> '' THEN BEGIN
              IF item.GET(XMLNewChildTemp.InnerText) THEN BEGIN
                Add_ItemCustomer(item,customer,XMLNewChild,FilterNodes.Item(i), XMLNewChildUOMPrices);
              END;
          END;
        END;
      END ELSE BEGIN
        IF item.FINDSET(FALSE,FALSE) THEN BEGIN
          REPEAT
            ERROR('Not Implemented all')
          UNTIL item.NEXT=0;
        END;
      END;
    END;

    LOCAL PROCEDURE Add_ItemCustomer@1000000032(item@1000000000 : Record 27;customer@1000000006 : Record 18;VAR XMLNewChildProd@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";node@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildUOMPrices@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      Languages@1000000007 : Record 8;
      itemvariants@1000000004 : Record 5401;
      pricemgt@1000000005 : Codeunit 7000;
      TempSalesPrice@1000000008 : TEMPORARY Record 7002;
      TempSalesLineDisc@1000000013 : TEMPORARY Record 7004;
      TempSalesHeader@1000000009 : TEMPORARY Record 36;
      TempSalesLine@1000000010 : TEMPORARY Record 37;
      VATPostingSetup@1000000012 : Record 325;
      variant@1000000001 : Text;
      isOldVersion@1000000003 : Boolean;
      itemUOM@1000000014 : Record 5404;
      priceWithVAT@1000000016 : Decimal;
      priceWithoutVAT@1000000017 : Decimal;
      price@1000000018 : Decimal;
      uom@1000000019 : Code[10];
    BEGIN
      Add_Element(XMLNewChildProd,'item','','',XMLNewChildProd,'');
      Add_Attribute(XMLNewChildProd,'table','EcomProducts');

      isOldVersion := (Get_TextFromNode(node,'ProductID') <> '');

      //Old Live integration 1
      IF isOldVersion THEN BEGIN
        Add_Field(XMLNewChildProd,'ProductID',item."No.");
        variant := GetTextFromNode(node,'ProductVariantID',MAXSTRLEN(item."Variant Filter"));
        Add_Field(XMLNewChildProd,'ProductVariantID',variant);
      END ELSE BEGIN
        Add_Field(XMLNewChildProd,'ProductId',item."No.");
        variant := GetTextFromNode(node,'ProductVariantId',MAXSTRLEN(item."Variant Filter"));
        Add_Field(XMLNewChildProd,'ProductVariantId',variant);
        Add_Field(XMLNewChildProd,'ProductIdentifier',Get_TextFromNode(node,'ProductIdentifier'));
      END;

      item."Variant Filter" := variant;
      Add_Field(XMLNewChildProd,'ProductNumber',item."No.");

      IF (variant = '') THEN
        Add_Field(XMLNewChildProd,'ProductName',item.Description)
      ELSE BEGIN
        CLEAR(itemvariants);
        itemvariants.SETRANGE("Item No.",item."No.");
        itemvariants.SETRANGE(Code,variant);
        IF itemvariants.FINDFIRST THEN
          Add_Field(XMLNewChildProd,'ProductName',itemvariants.Description);
          item.SETRANGE("Variant Filter", variant);
      END;
      item.CALCFIELDS(Inventory);

      VATPostingSetup.GET(customer."VAT Bus. Posting Group",item."VAT Prod. Posting Group");
      AllowLineDisc := customer."Allow Line Disc.";
      AllowInvDisc := item."Allow Invoice Disc.";
      Qty := 1;
      QtyPerUOM := 1;
      VATCalcType := VATPostingSetup."VAT Calculation Type";
      PricesInclVAT := customer."Prices Including VAT";
      VATBusPostingGr := customer."VAT Bus. Posting Group";
      VATPerCent := VATPostingSetup."VAT %";
      PricesInCurrency := TRUE;


      CLEAR(TempSalesPrice);
      CLEAR(TempSalesLineDisc);
      TempSalesPrice.DELETEALL;
      TempSalesLineDisc.DELETEALL;
      
      uom := GetItemUnitId(item, Get_TextFromNode(node, 'ProductUnitId'));
      pricemgt.FindSalesLineDisc(TempSalesLineDisc, customer."No.",'',customer."Customer Disc. Group",'',item."No.",item."Item Disc. Group",variant,uom,Currency.Code,ExchRateDate,FALSE);
      CalcBestLineDisc(TempSalesLineDisc);
      LineDiscPerCent := TempSalesLineDisc."Line Discount %";

      pricemgt.FindSalesPrice(TempSalesPrice,customer."No.",'',customer."Customer Price Group",'',item."No.",variant,uom,Currency.Code,ExchRateDate,FALSE);
      CalcBestUnitPrice(TempSalesPrice,item);

      price := CalcLineAmount(TempSalesPrice);
      CalculatePriceWithVat(customer."Prices Including VAT", VATPostingSetup."VAT %", price, priceWithoutVAT, priceWithVAT);
      Add_Field(XMLNewChildProd, 'ProductPrice', FORMAT(priceWithoutVAT));
      Add_Field(XMLNewChildProd, 'ProductPriceWithVat', FORMAT(priceWithVAT));
      Add_Field(XMLNewChildProd,'ProductStock',FORMAT(item.Inventory));
      Add_Field(XMLNewChildProd,'ProductCurrencyCode',Currency.Code);

      IF NOT ISNULL(XMLNewChildUOMPrices) THEN BEGIN
        Add_Field(XMLNewChildProd,'ProductDefaultUnitId',STRSUBSTNO('Unit_%1',item."Base Unit of Measure"));
        itemUOM.SETRANGE("Item No.", item."No.");
        IF itemUOM.FINDSET(FALSE,FALSE) THEN BEGIN
          REPEAT
            Add_Element(XMLNewChildUOMPrices,'item','','',XMLNewChildUOMPrices,'');
            Add_Attribute(XMLNewChildUOMPrices,'table','EcomPrices');
            Add_Field(XMLNewChildUOMPrices,'PriceProductId',item."No.");
            Add_Field(XMLNewChildUOMPrices,'PriceUserCustomerNumber',customer."No.");
            Add_Field(XMLNewChildUOMPrices,'PriceProductUnitId',STRSUBSTNO('Unit_%1',itemUOM.Code));
            Add_Field(XMLNewChildUOMPrices,'PriceQuantity',FORMAT(itemUOM."Qty. per Unit of Measure"));

            TempSalesPrice.DELETEALL;
            TempSalesLineDisc.DELETEALL;
            QtyPerUOM := itemUOM."Qty. per Unit of Measure";

            pricemgt.FindSalesLineDisc(TempSalesLineDisc, customer."No.",'',customer."Customer Disc. Group",'',item."No.",item."Item Disc. Group",variant,itemUOM.Code,Currency.Code,ExchRateDate,FALSE);
            CalcBestLineDisc(TempSalesLineDisc);
            LineDiscPerCent := TempSalesLineDisc."Line Discount %";
            pricemgt.FindSalesPrice(TempSalesPrice,customer."No.",'',customer."Customer Price Group",'',item."No.",variant,itemUOM.Code,Currency.Code,ExchRateDate,FALSE);
            CalcBestUnitPrice(TempSalesPrice,item);

            price := CalcLineAmount(TempSalesPrice);
            CalculatePriceWithVat(customer."Prices Including VAT", VATPostingSetup."VAT %", price, priceWithoutVAT, priceWithVAT);
            Add_Field(XMLNewChildUOMPrices, 'PriceAmount', FORMAT(priceWithoutVAT));
            Add_Field(XMLNewChildUOMPrices, 'PriceAmountWithVat', FORMAT(priceWithVAT));

            XMLNewChildUOMPrices := XMLNewChildUOMPrices.ParentNode;
          UNTIL itemUOM.NEXT = 0;
        END;
      END;

      XMLNewChildProd := XMLNewChildProd.ParentNode;
    END;

    LOCAL PROCEDURE Add_SalesHeader@1000000027(salesheader@1000000000 : Record 36;VAR XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";tempoary@1000000003 : Boolean;VAR Total@1000000005 : Decimal;VAR Discount@1000000004 : Decimal;FromCustomerCenter@1000000006 : Boolean;calculateOrderIF2@1000000008 : Boolean);
    VAR
      prefix@1000000007 : Text;
    BEGIN
      IF (FromCustomerCenter = FALSE ) THEN BEGIN
        prefix := 'Order';
        IF (tempoary = FALSE) THEN
          Add_Field(XMLNewChild,'OrderCreated','TRUE')
        ELSE
          Add_Field(XMLNewChild,'OrderCreated','FALSE');
      END;

      IF calculateOrderIF2 THEN
        Add_Field(XMLNewChild,prefix+'Id',salesheader."No.")
      ELSE
        Add_Field(XMLNewChild,prefix+'ID',salesheader."No.");

      Add_Field(XMLNewChild,prefix+'CurrencyCode',salesheader."Currency Code");
      Add_Field(XMLNewChild,prefix+'Date',FORMAT(salesheader."Order Date"));
      Add_Field(XMLNewChild,prefix+'PaymentMethodName',salesheader."Payment Method Code");
      Add_Field(XMLNewChild,prefix+'CustomerName',salesheader."Sell-to Customer Name");
      Add_Field(XMLNewChild,prefix+'CustomerAddress',salesheader."Sell-to Address");
      Add_Field(XMLNewChild,prefix+'CustomerAddress2',salesheader."Sell-to Address 2");
      Add_Field(XMLNewChild,prefix+'CustomerCity',salesheader."Sell-to City");
      Add_Field(XMLNewChild,prefix+'CustomerCountryCode',salesheader."Sell-to Country/Region Code");
      Add_Field(XMLNewChild,prefix+'CustomerEmail','');
      Add_Field(XMLNewChild,prefix+'CustomerFax','');
      Add_Field(XMLNewChild,prefix+'CustomerPhone','');
      Add_Field(XMLNewChild,prefix+'CustomerZip',salesheader."Ship-to Post Code");
      Add_Field(XMLNewChild,prefix+'DeliveryName',salesheader."Ship-to Name");
      Add_Field(XMLNewChild,prefix+'DeliveryAddress',salesheader."Ship-to Address");
      Add_Field(XMLNewChild,prefix+'DeliveryAddress2',salesheader."Ship-to Address 2");
      Add_Field(XMLNewChild,prefix+'DeliveryCity',salesheader."Ship-to City");
      Add_Field(XMLNewChild,prefix+'DeliveryCountryCode',salesheader."Ship-to Country/Region Code");
      Add_Field(XMLNewChild,prefix+'DeliveryEmail','');
      Add_Field(XMLNewChild,prefix+'DeliveryFax','');
      Add_Field(XMLNewChild,prefix+'DeliveryPhone','');
      Add_Field(XMLNewChild,prefix+'DeliveryZip',salesheader."Ship-to Post Code");
      IF calculateOrderIF2 THEN BEGIN
        Add_Field(XMLNewChild,prefix+'PriceWithVat',FORMAT(Order_OrderPriceWithVAT));
        Add_Field(XMLNewChild,prefix+'PriceWithoutVat',FORMAT(Order_OrderPriceWithoutVAT));
        Add_Field(XMLNewChild,prefix+'PriceVat',FORMAT(Order_OrderPriceVAT));
      END ELSE BEGIN
        Add_Field(XMLNewChild,prefix+'PriceWithVAT',FORMAT(Order_OrderPriceWithVAT));
        Add_Field(XMLNewChild,prefix+'PriceWithoutVAT',FORMAT(Order_OrderPriceWithoutVAT));
        Add_Field(XMLNewChild,prefix+'PriceVAT',FORMAT(Order_OrderPriceVAT));
      END;
      Add_Field(XMLNewChild,prefix+'SalesDiscount',FORMAT(Order_OrderSalesDiscount));
    END;

    LOCAL PROCEDURE Add_SalesLine@1000000031(salesheader@1000000000 : Record 36;salesLine@1000000003 : Record 37;VAR XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Parent@1000000001 : Code[20];FromCustomerCenter@1000000008 : Boolean;calculateOrderIF2@1000000010 : Boolean;dynamicwebDiscountId@1000000013 : Text;dynamicwebDiscountName@1000000014 : Text);
    VAR
      price@1000000004 : Decimal;
      VATPostingSetup@1000000005 : Record 325;
      TempWithWAT@1000000006 : Decimal;
      TempWithoutWAT@1000000007 : Decimal;
      prefix@1000000009 : Text;
      idPrefix@1000000011 : Text;
      vatPrefix@1000000012 : Text;
    BEGIN
      IF (FromCustomerCenter = FALSE ) THEN BEGIN
        prefix := 'OrderLine';
      END;

      IF calculateOrderIF2 THEN BEGIN
        idPrefix := 'Id';
        vatPrefix := 'Vat';
      END ELSE BEGIN
        idPrefix := 'ID';
        vatPrefix := 'VAT';
      END;

      IF salesheader."Currency Code" = '' THEN
         Currency.InitRoundingPrecision
      ELSE
         Currency.GET(salesheader."Currency Code");

      Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrderLines');


      Add_Field(XMLNewChild,prefix+'ProductNumber',salesLine."No.");
      Add_Field(XMLNewChild,prefix+'ProductVariant'+idPrefix,salesLine."Variant Code");
      IF calculateOrderIF2 AND (salesLine."Unit of Measure Code" <> '') THEN
        Add_Field(XMLNewChild,prefix+'UnitId',STRSUBSTNO('Unit_%1',salesLine."Unit of Measure Code"));

      IF (Parent <> '') THEN BEGIN
        Add_Field(XMLNewChild,prefix+'ParentLine'+idPrefix,FORMAT(salesLine."Line No."));
        Add_Field(XMLNewChild,prefix+'Type','3');
        Add_Field(XMLNewChild,prefix+'Quantity','1');
        IF dynamicwebDiscountId <> '' THEN BEGIN
          Add_Field(XMLNewChild, prefix + 'DiscountId', dynamicwebDiscountId);
          Add_Field(XMLNewChild, prefix + 'ProductName', dynamicwebDiscountName);
        END;

        IF salesheader."Prices Including VAT" THEN BEGIN
          TempWithWAT := salesLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesLine."Line Discount Amount";
          Add_Field(XMLNewChild,prefix+'PriceWith'+vatPrefix,FORMAT(salesLine."Line Discount Amount"));
          Add_Field(XMLNewChild,prefix+'UnitPriceWith'+vatPrefix,FORMAT(salesLine."Line Discount Amount"));
          TempWithoutWAT := ROUND(salesLine."Line Discount Amount"/ (1 + (salesLine."VAT %" / 100)), 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWithout'+vatPrefix,FORMAT(TempWithoutWAT));
          Add_Field(XMLNewChild,prefix+'UnitPriceWithout'+vatPrefix,FORMAT(TempWithoutWAT));
        END ELSE BEGIN
          TempWithoutWAT := salesLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesLine."Line Discount Amount";
          Add_Field(XMLNewChild,prefix+'PriceWithout'+vatPrefix,FORMAT(salesLine."Line Discount Amount"));
          Add_Field(XMLNewChild,prefix+'UnitPriceWithout'+vatPrefix,FORMAT(salesLine."Line Discount Amount"));
          TempWithWAT := ROUND(salesLine."Line Discount Amount" * (1 + (salesLine."VAT %" / 100)), 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWith'+vatPrefix,FORMAT(TempWithWAT));
          Add_Field(XMLNewChild,prefix+'UnitPriceWith'+vatPrefix,FORMAT(TempWithWAT));
        END;

        Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT - TempWithoutWAT;
        Order_OrderPriceWithVAT := Order_OrderPriceWithVAT - TempWithWAT ;

        Add_Field(XMLNewChild,prefix+'DiscountPercentage',FORMAT(salesLine."Line Discount %"));
        Add_Field(XMLNewChild,prefix+'Price'+vatPrefix,FORMAT(TempWithWAT-TempWithoutWAT));
        Add_Field(XMLNewChild,prefix+'UnitPrice'+vatPrefix,FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT - (TempWithWAT-TempWithoutWAT);
        Add_Field(XMLNewChild,prefix+'Price'+vatPrefix+'Percent',FORMAT(salesLine."VAT %"));
        Add_Field(XMLNewChild,prefix+'UnitPrice'+vatPrefix+'Percent',FORMAT(salesLine."VAT %"));

      END ELSE BEGIN
        Add_Field(XMLNewChild,prefix+idPrefix,FORMAT(salesLine."Line No."));
        Add_Field(XMLNewChild,prefix+'Quantity',FORMAT(salesLine.Quantity));
        Add_Field(XMLNewChild,prefix+'Type','0');

        IF (salesheader."Prices Including VAT" = TRUE) THEN BEGIN
          TempWithWAT := ROUND(salesLine."Unit Price" * salesLine.Quantity, 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWith'+vatPrefix,FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT;
          Add_Field(XMLNewChild,prefix+'UnitPriceWith'+vatPrefix,FORMAT(salesLine."Unit Price"));
          TempWithoutWAT := ROUND((TempWithWAT/  (1 + (salesLine."VAT %" / 100))), 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWithout'+vatPrefix,FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,prefix+'UnitPriceWithout'+vatPrefix,FORMAT(ROUND(salesLine."Unit Price" / (1 + (salesLine."VAT %" / 100)), 0.01, '=')));
        END ELSE BEGIN
          TempWithoutWAT := ROUND(salesLine."Unit Price" * salesLine.Quantity, 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWithout'+vatPrefix,FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,prefix+'UnitPriceWithout'+vatPrefix,FORMAT(salesLine."Unit Price"));
          TempWithWAT :=  ROUND((TempWithoutWAT * (1 + (salesLine."VAT %" / 100))), 0.01, '=');
          Add_Field(XMLNewChild,prefix+'PriceWith'+vatPrefix,FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT ;
          Add_Field(XMLNewChild,prefix+'UnitPriceWith'+vatPrefix,FORMAT(ROUND(salesLine."Unit Price" * (1 + (salesLine."VAT %" / 100)), 0.01, '=')));
        END;

        Add_Field(XMLNewChild,prefix+'Price'+vatPrefix,FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT + (TempWithWAT-TempWithoutWAT);
        IF (salesLine.Quantity <> 0) THEN
            Add_Field(XMLNewChild,prefix+'UnitPrice'+vatPrefix,FORMAT(ROUND((TempWithWAT-TempWithoutWAT)/salesLine.Quantity, 0.01, '=')))
        ELSE
            Add_Field(XMLNewChild,prefix+'UnitPrice'+vatPrefix,FORMAT(ROUND((TempWithWAT-TempWithoutWAT), 0.01, '=')));

        Add_Field(XMLNewChild,prefix+'Price'+vatPrefix+'Percent',FORMAT(salesLine."VAT %"));
        Add_Field(XMLNewChild,prefix+'UnitPrice'+vatPrefix+'Percent',FORMAT(salesLine."VAT %"));
      END;

      XMLNewChild := XMLNewChild.ParentNode;
    END;

    LOCAL PROCEDURE Add_SalesInvHeader@1000000037(salesInvheader@1000000000 : Record 112;VAR XMLCurrNode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR Total@1000000005 : Decimal;VAR Discount@1000000004 : Decimal);
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLCurrNode,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrders');
      Add_Field(XMLNewChild,'ID',salesInvheader."No.");
      Add_Field(XMLNewChild,'CurrencyCode',salesInvheader."Currency Code");
      Add_Field(XMLNewChild,'Date',FORMAT(salesInvheader."Order Date"));
      Add_Field(XMLNewChild,'PaymentMethodName',salesInvheader."Payment Method Code");
      Add_Field(XMLNewChild,'ShippingMethodName',salesInvheader."Shipment Method Code");
      Add_Field(XMLNewChild,'CustomerName',salesInvheader."Sell-to Customer Name");
      Add_Field(XMLNewChild,'CustomerAddress',salesInvheader."Sell-to Address");
      Add_Field(XMLNewChild,'CustomerAddress2',salesInvheader."Sell-to Address 2");
      Add_Field(XMLNewChild,'CustomerCity',salesInvheader."Sell-to City");
      Add_Field(XMLNewChild,'CustomerCountryCode',salesInvheader."Sell-to Country/Region Code");
      Add_Field(XMLNewChild,'CustomerEmail','');
      Add_Field(XMLNewChild,'CustomerFax','');
      Add_Field(XMLNewChild,'CustomerPhone','');
      Add_Field(XMLNewChild,'CustomerZip',salesInvheader."Ship-to Post Code");
      Add_Field(XMLNewChild,'DeliveryName',salesInvheader."Ship-to Name");
      Add_Field(XMLNewChild,'DeliveryAddress',salesInvheader."Ship-to Address");
      Add_Field(XMLNewChild,'DeliveryAddress2',salesInvheader."Ship-to Address 2");
      Add_Field(XMLNewChild,'DeliveryCity',salesInvheader."Ship-to City");
      Add_Field(XMLNewChild,'DeliveryCountryCode',salesInvheader."Ship-to Country/Region Code");
      Add_Field(XMLNewChild,'DeliveryEmail','');
      Add_Field(XMLNewChild,'DeliveryFax','');
      Add_Field(XMLNewChild,'DeliveryPhone','');
      Add_Field(XMLNewChild,'DeliveryZip',salesInvheader."Ship-to Post Code");
      Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(Order_OrderPriceWithVAT));
      Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(Order_OrderPriceWithoutVAT));
      Add_Field(XMLNewChild,'PriceVAT',FORMAT(Order_OrderPriceVAT));
      Add_Field(XMLNewChild,'SalesDiscount',FORMAT(Order_OrderSalesDiscount));
      Add_Field(XMLNewChild,'ShippingFee','');
    END;

    LOCAL PROCEDURE Add_SalesInvLine@1000000025(salesinvheader@1000000000 : Record 112;salesinvLine@1000000003 : Record 113;VAR XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Parent@1000000001 : Code[20]);
    VAR
      price@1000000004 : Decimal;
      VATPostingSetup@1000000005 : Record 325;
      TempWithWAT@1000000006 : Decimal;
      TempWithoutWAT@1000000007 : Decimal;
    BEGIN

      IF salesinvheader."Currency Code" = '' THEN
         Currency.InitRoundingPrecision
      ELSE
         Currency.GET(salesinvheader."Currency Code");

      Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrderLines');

      Add_Field(XMLNewChild,'ProductNumber',salesinvLine."No.");
      Add_Field(XMLNewChild,'ProductVariantID',salesinvLine."Variant Code");

      IF (Parent <> '') THEN BEGIN
        Add_Field(XMLNewChild,'ParentLineID',FORMAT(salesinvLine."Line No."));
        Add_Field(XMLNewChild,'Type','3');
        Add_Field(XMLNewChild,'Quantity','1');

        IF salesinvheader."Prices Including VAT" THEN BEGIN
          TempWithWAT := salesinvLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesinvLine."Line Discount Amount";
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(salesinvLine."Line Discount Amount"));
          TempWithoutWAT := salesinvLine."Line Discount Amount"/ (1 + (salesinvLine."VAT %" / 100));
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
        END ELSE BEGIN
          TempWithoutWAT := salesinvLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesinvLine."Line Discount Amount";
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(salesinvLine."Line Discount Amount"));
          TempWithWAT := salesinvLine."Line Discount Amount" * (1 + (salesinvLine."VAT %" / 100));
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
        END;

        Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT - TempWithoutWAT;
        Order_OrderPriceWithVAT := Order_OrderPriceWithVAT - TempWithWAT ;

        Add_Field(XMLNewChild,'DiscountPercentage',FORMAT(salesinvLine."Line Discount %"));
        Add_Field(XMLNewChild,'PriceVAT',FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT - (TempWithWAT-TempWithoutWAT);
        Add_Field(XMLNewChild,'PriceVATPercent',FORMAT(salesinvLine."VAT %"));
        Add_Field(XMLNewChild,'UnitPriceVATPercent',FORMAT(salesinvLine."VAT %"));

      END ELSE BEGIN

        Add_Field(XMLNewChild,'ID',FORMAT(salesinvLine."Line No."));
        Add_Field(XMLNewChild,'Quantity',FORMAT(salesinvLine.Quantity));
        Add_Field(XMLNewChild,'Type','0');

        IF (salesinvheader."Prices Including VAT" = TRUE) THEN BEGIN
          TempWithWAT := salesinvLine."Unit Price" * salesinvLine.Quantity;
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT;
          Add_Field(XMLNewChild,'UnitPriceWithVAT',FORMAT(salesinvLine."Unit Price"));
          TempWithoutWAT := ((salesinvLine."Unit Price" * salesinvLine.Quantity)/  (1 + (salesinvLine."VAT %" / 100)));
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,'UnitPriceWithoutVAT',FORMAT(salesinvLine."Unit Price" / (1 + (salesinvLine."VAT %" / 100))));
        END ELSE BEGIN
          TempWithoutWAT := salesinvLine."Unit Price" * salesinvLine.Quantity;
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,'UnitPriceWithoutVAT',FORMAT(salesinvLine."Unit Price"));
          TempWithWAT :=  ((salesinvLine."Unit Price" * salesinvLine.Quantity) * (1 + (salesinvLine."VAT %" / 100)));
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT ;
          Add_Field(XMLNewChild,'UnitPriceWithVAT',FORMAT(salesinvLine."Unit Price" * (1 + (salesinvLine."VAT %" / 100))));
        END;

        Add_Field(XMLNewChild,'PriceVAT',FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT + (TempWithWAT-TempWithoutWAT);
        IF (salesinvLine.Quantity <> 0) THEN
            Add_Field(XMLNewChild,'UnitPriceVAT',FORMAT((TempWithWAT-TempWithoutWAT)/salesinvLine.Quantity))
        ELSE
            Add_Field(XMLNewChild,'UnitPriceVAT',FORMAT((TempWithWAT-TempWithoutWAT)));

        Add_Field(XMLNewChild,'PriceVATPercent',FORMAT(salesinvLine."VAT %"));
        Add_Field(XMLNewChild,'UnitPriceVATPercent',FORMAT(salesinvLine."VAT %"));
      END;

      XMLNewChild := XMLNewChild.ParentNode;
    END;

    LOCAL PROCEDURE Add_SalesCrMemoHeader@1000000020(salescrmemoheader@1000000000 : Record 114;VAR XMLCurrNode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR Total@1000000005 : Decimal;VAR Discount@1000000004 : Decimal);
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLCurrNode,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrders');
      Add_Field(XMLNewChild,'ID',salescrmemoheader."No.");
      Add_Field(XMLNewChild,'CurrencyCode',salescrmemoheader."Currency Code");
      //Add_Field(XMLNewChild,'OrderDate',FORMAT(salescrmemoheader."Order Date"));
      Add_Field(XMLNewChild,'PaymentMethodName',salescrmemoheader."Payment Method Code");
      Add_Field(XMLNewChild,'ShippingMethodName',salescrmemoheader."Shipment Method Code");
      Add_Field(XMLNewChild,'CustomerName',salescrmemoheader."Sell-to Customer Name");
      Add_Field(XMLNewChild,'CustomerAddress',salescrmemoheader."Sell-to Address");
      Add_Field(XMLNewChild,'CustomerAddress2',salescrmemoheader."Sell-to Address 2");
      Add_Field(XMLNewChild,'CustomerCity',salescrmemoheader."Sell-to City");
      Add_Field(XMLNewChild,'CustomerCountryCode',salescrmemoheader."Sell-to Country/Region Code");
      Add_Field(XMLNewChild,'CustomerEmail','');
      Add_Field(XMLNewChild,'CustomerFax','');
      Add_Field(XMLNewChild,'CustomerPhone','');
      Add_Field(XMLNewChild,'CustomerZip',salescrmemoheader."Ship-to Post Code");
      Add_Field(XMLNewChild,'DeliveryName',salescrmemoheader."Ship-to Name");
      Add_Field(XMLNewChild,'DeliveryAddress',salescrmemoheader."Ship-to Address");
      Add_Field(XMLNewChild,'DeliveryAddress2',salescrmemoheader."Ship-to Address 2");
      Add_Field(XMLNewChild,'DeliveryCity',salescrmemoheader."Ship-to City");
      Add_Field(XMLNewChild,'DeliveryCountryCode',salescrmemoheader."Ship-to Country/Region Code");
      Add_Field(XMLNewChild,'DeliveryEmail','');
      Add_Field(XMLNewChild,'DeliveryFax','');
      Add_Field(XMLNewChild,'DeliveryPhone','');
      Add_Field(XMLNewChild,'DeliveryZip',salescrmemoheader."Ship-to Post Code");
      Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(Order_OrderPriceWithVAT));
      Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(Order_OrderPriceWithoutVAT));
      Add_Field(XMLNewChild,'PriceVAT',FORMAT(Order_OrderPriceVAT));
      Add_Field(XMLNewChild,'SalesDiscount',FORMAT(Order_OrderSalesDiscount));
      Add_Field(XMLNewChild,'ShippingFee','');
    END;

    LOCAL PROCEDURE Add_SalesCrMemoLine@1000000034(salesCrMemoheader@1000000000 : Record 114;salesCrMemoLine@1000000003 : Record 115;VAR XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Parent@1000000001 : Code[20]);
    VAR
      price@1000000004 : Decimal;
      VATPostingSetup@1000000005 : Record 325;
      TempWithWAT@1000000006 : Decimal;
      TempWithoutWAT@1000000007 : Decimal;
    BEGIN

      IF salesCrMemoheader."Currency Code" = '' THEN
         Currency.InitRoundingPrecision
      ELSE
         Currency.GET(salesCrMemoheader."Currency Code");

      Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrderLines');
      Add_Field(XMLNewChild,'ProductNumber',salesCrMemoLine."No.");
      Add_Field(XMLNewChild,'ProductVariantID',salesCrMemoLine."Variant Code");

      IF (Parent <> '') THEN BEGIN
        Add_Field(XMLNewChild,'ParentLineID',FORMAT(salesCrMemoLine."Line No."));
        Add_Field(XMLNewChild,'Type','3');
        Add_Field(XMLNewChild,'Quantity','1');

        IF salesCrMemoheader."Prices Including VAT" THEN BEGIN
          TempWithWAT := salesCrMemoLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesCrMemoLine."Line Discount Amount";
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(salesCrMemoLine."Line Discount Amount"));
          TempWithoutWAT := salesCrMemoLine."Line Discount Amount"/ (1 + (salesCrMemoLine."VAT %" / 100));
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
        END ELSE BEGIN
          TempWithoutWAT := salesCrMemoLine."Line Discount Amount";
          Order_OrderSalesDiscount := Order_OrderSalesDiscount + salesCrMemoLine."Line Discount Amount";
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(salesCrMemoLine."Line Discount Amount"));
          TempWithWAT := salesCrMemoLine."Line Discount Amount" * (1 + (salesCrMemoLine."VAT %" / 100));
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
        END;

        Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT - TempWithoutWAT;
        Order_OrderPriceWithVAT := Order_OrderPriceWithVAT - TempWithWAT ;

        Add_Field(XMLNewChild,'DiscountPercentage',FORMAT(salesCrMemoLine."Line Discount %"));
        Add_Field(XMLNewChild,'PriceVAT',FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT - (TempWithWAT-TempWithoutWAT);
        Add_Field(XMLNewChild,'PriceVATPercent',FORMAT(salesCrMemoLine."VAT %"));
        Add_Field(XMLNewChild,'UnitPriceVATPercent',FORMAT(salesCrMemoLine."VAT %"));

      END ELSE BEGIN

        Add_Field(XMLNewChild,'ID',FORMAT(salesCrMemoLine."Line No."));
        Add_Field(XMLNewChild,'Quantity',FORMAT(salesCrMemoLine.Quantity));
        Add_Field(XMLNewChild,'Type','0');

        IF (salesCrMemoheader."Prices Including VAT" = TRUE) THEN BEGIN
          TempWithWAT := salesCrMemoLine."Unit Price" * salesCrMemoLine.Quantity;
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT;
          Add_Field(XMLNewChild,'UnitPriceWithVAT',FORMAT(salesCrMemoLine."Unit Price"));
          TempWithoutWAT := ((salesCrMemoLine."Unit Price" * salesCrMemoLine.Quantity)/  (1 + (salesCrMemoLine."VAT %" / 100)));
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,'UnitPriceWithoutVAT',FORMAT(salesCrMemoLine."Unit Price" / (1 + (salesCrMemoLine."VAT %" / 100))));
        END ELSE BEGIN
          TempWithoutWAT := salesCrMemoLine."Unit Price" * salesCrMemoLine.Quantity;
          Add_Field(XMLNewChild,'PriceWithoutVAT',FORMAT(TempWithoutWAT));
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
          Add_Field(XMLNewChild,'UnitPriceWithoutVAT',FORMAT(salesCrMemoLine."Unit Price"));
          TempWithWAT :=  ((salesCrMemoLine."Unit Price" * salesCrMemoLine.Quantity) * (1 + (salesCrMemoLine."VAT %" / 100)));
          Add_Field(XMLNewChild,'PriceWithVAT',FORMAT(TempWithWAT));
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT ;
          Add_Field(XMLNewChild,'UnitPriceWithVAT',FORMAT(salesCrMemoLine."Unit Price" * (1 + (salesCrMemoLine."VAT %" / 100))));
        END;

        Add_Field(XMLNewChild,'PriceVAT',FORMAT(TempWithWAT-TempWithoutWAT));
        Order_OrderPriceVAT := Order_OrderPriceVAT + (TempWithWAT-TempWithoutWAT);
        IF (salesCrMemoLine.Quantity <> 0) THEN
            Add_Field(XMLNewChild,'UnitPriceVAT',FORMAT((TempWithWAT-TempWithoutWAT)/salesCrMemoLine.Quantity))
        ELSE
            Add_Field(XMLNewChild,'UnitPriceVAT',FORMAT((TempWithWAT-TempWithoutWAT)));

        Add_Field(XMLNewChild,'PriceVATPercent',FORMAT(salesCrMemoLine."VAT %"));
        Add_Field(XMLNewChild,'UnitPriceVATPercent',FORMAT(salesCrMemoLine."VAT %"));
      END;

      XMLNewChild := XMLNewChild.ParentNode;
    END;

    LOCAL PROCEDURE Add_Element@1060001(VAR XMLNode@1001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";NodeName@1060002 : Text;NodeText@1060003 : Text;NameSpace@1060004 : Text;VAR CreatedXMLNode@1060005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";prefix@1060006 : Text);
    VAR
      NewChildNode@1060008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      IF NOT NormalCaseMode THEN
        IF prefix <> '' THEN
          NodeName := prefix + ':' + NodeName;

      NewChildNode := XMLNode.OwnerDocument.CreateNode('element', NodeName, NameSpace);

      IF ISNULL(NewChildNode ) THEN
        ERROR(Text000, NodeName);

      IF NodeText <> '' THEN
        NewChildNode.InnerText := NodeText;

      XMLNode.AppendChild(NewChildNode);
      CreatedXMLNode := NewChildNode;
    END;

    LOCAL PROCEDURE Add_CdataElement@1000000006(VAR XMLNode@1001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";NodeText@1060003 : Text);
    VAR
      NewChildNode@1060008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      NewChildNode := XMLNode.OwnerDocument.CreateCDataSection(NodeText);
      XMLNode.AppendChild(NewChildNode);
    END;

    LOCAL PROCEDURE Add_Attribute@1060002(VAR XMLNode@1001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Name@1060003 : Text;NodeValue@1060004 : Text);
    VAR
      XMLNewAttributeNode@1060006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      XMLNewAttributeNode := XMLNode.OwnerDocument.CreateAttribute(Name);

      IF ISNULL(XMLNewAttributeNode) THEN
        ERROR(Text001, Name);

      IF NodeValue <> '' THEN
        XMLNewAttributeNode.InnerText := NodeValue;

      XMLNode.Attributes.SetNamedItem(XMLNewAttributeNode);
    END;

    LOCAL PROCEDURE SetNormalCase@1060006();
    BEGIN
      NormalCaseMode := TRUE;
    END;

    LOCAL PROCEDURE Add_Field@1000000005(VAR XMLNode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Field@1000000003 : Text;Value@1000000000 : Text);
    VAR
      XmlNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLNode,'column','','',XmlNewChild,'');
      Add_Attribute(XmlNewChild,'columnName',Field);
      Add_CdataElement(XmlNewChild,Value);
      XmlNewChild := XmlNewChild.ParentNode;
    END;

    LOCAL PROCEDURE ConvertXmlToBigText@1000000013(XMLdoc@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR bigtext@1000000001 : BigText);
    VAR
      xmlNode@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      CLEAR(bigtext);
      xmlNode := XMLdoc.DocumentElement;
      Add_Attribute(xmlNode,'version',GetVersion());
      bigtext.ADDTEXT(XMLdoc.InnerXml);
    END;

    LOCAL PROCEDURE ConvertBigTestToXml@1000000017(VAR XMLdoc@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR bigtext@1000000000 : BigText);
    BEGIN
      IF ISNULL(XMLdoc) THEN
       XMLdoc := XMLdoc.XmlDocument;

      XMLdoc.LoadXml(FORMAT(bigtext));
    END;

    LOCAL PROCEDURE Get_TextFromNode@1000000008(XMLnode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";xpath@1000000000 : Text) : Text;
    VAR
      SelectedXMLnode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      SelectedXMLnode := XMLnode.SelectSingleNode(xpath);
      IF NOT ISNULL(SelectedXMLnode)  THEN
        EXIT( SelectedXMLnode.InnerText)
      ELSE
        EXIT('');
    END;

    LOCAL PROCEDURE Get_DecimalFromNode@1000000022(XMLnode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";xpath@1000000000 : Text) : Decimal;
    VAR
      SelectedXMLnode@1000000001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 3.0:{2933BF80-7B36-11D2-B20E-00C04F983E60}:'Microsoft XML, v3.0'.IXMLDOMNode";
      tempdecimal@1000000003 : Decimal;
    BEGIN
      IF NOT EVALUATE(tempdecimal,Get_TextFromNode(XMLnode,xpath)) THEN
        EXIT(0);
      EXIT(tempdecimal);
    END;

    LOCAL PROCEDURE CalcBestUnitPrice@1(VAR SalesPrice@1000 : Record 7002;item@1000000000 : Record 27);
    VAR
      BestSalesPrice@1002 : Record 7002;
    BEGIN
      WITH SalesPrice DO BEGIN
        FoundSalesPrice := FINDSET;
        IF FoundSalesPrice THEN
          REPEAT
            IF IsInMinQty("Unit of Measure Code","Minimum Quantity") THEN BEGIN
              ConvertPriceToVAT(
                "Price Includes VAT",item."VAT Prod. Posting Group",
                "VAT Bus. Posting Gr. (Price)","Unit Price");
              ConvertPriceToUoM("Unit of Measure Code","Unit Price");
              ConvertPriceLCYToFCY("Currency Code","Unit Price");

              CASE TRUE OF
                ((BestSalesPrice."Currency Code" = '') AND ("Currency Code" <> '')) OR
                ((BestSalesPrice."Variant Code" = '') AND ("Variant Code" <> '')):
                  BestSalesPrice := SalesPrice;
                ((BestSalesPrice."Currency Code" = '') OR ("Currency Code" <> '')) AND
                ((BestSalesPrice."Variant Code" = '') OR ("Variant Code" <> '')):
                  IF (BestSalesPrice."Unit Price" = 0) OR
                     (CalcLineAmount(BestSalesPrice) > CalcLineAmount(SalesPrice))
                  THEN
                    BestSalesPrice := SalesPrice;
              END;
            END;
          UNTIL NEXT = 0;
      END;

      // No price found in agreement
      IF BestSalesPrice."Unit Price" = 0 THEN BEGIN
        ConvertPriceToVAT(
          item."Price Includes VAT",item."VAT Prod. Posting Group",
          item."VAT Bus. Posting Gr. (Price)",item."Unit Price");
        ConvertPriceToUoM('',item."Unit Price");
        ConvertPriceLCYToFCY('',item."Unit Price");

        CLEAR(BestSalesPrice);
        BestSalesPrice."Unit Price" := item."Unit Price";
        BestSalesPrice."Allow Line Disc." := AllowLineDisc;
        BestSalesPrice."Allow Invoice Disc." := AllowInvDisc;
      END;

      SalesPrice := BestSalesPrice;
    END;

    LOCAL PROCEDURE CalcBestLineDisc@11(VAR SalesLineDisc@1000 : Record 7004);
    VAR
      BestSalesLineDisc@1002 : Record 7004;
    BEGIN
      WITH SalesLineDisc DO BEGIN
        IF FINDSET THEN
          REPEAT
            IF IsInMinQty("Unit of Measure Code","Minimum Quantity") THEN
              CASE TRUE OF
                ((BestSalesLineDisc."Currency Code" = '') AND ("Currency Code" <> '')) OR
                ((BestSalesLineDisc."Variant Code" = '') AND ("Variant Code" <> '')):
                  BestSalesLineDisc := SalesLineDisc;
                ((BestSalesLineDisc."Currency Code" = '') OR ("Currency Code" <> '')) AND
                ((BestSalesLineDisc."Variant Code" = '') OR ("Variant Code" <> '')):
                  IF BestSalesLineDisc."Line Discount %" < "Line Discount %" THEN
                    BestSalesLineDisc := SalesLineDisc;
              END;
          UNTIL NEXT = 0;
      END;

      SalesLineDisc := BestSalesLineDisc;
    END;

    LOCAL PROCEDURE IsInMinQty@7(UnitofMeasureCode@1003 : Code[20];MinQty@1000 : Decimal) : Boolean;
    BEGIN
      IF UnitofMeasureCode = '' THEN
        EXIT(MinQty <= QtyPerUOM * Qty);
      EXIT(MinQty <= Qty);
    END;

    LOCAL PROCEDURE ConvertPriceToVAT@4(FromPricesInclVAT@1006 : Boolean;FromVATProdPostingGr@1000 : Code[20];FromVATBusPostingGr@1002 : Code[20];VAR UnitPrice@1004 : Decimal);
    VAR
      VATPostingSetup@1007 : Record 325;
    BEGIN
      IF FromPricesInclVAT THEN BEGIN
        VATPostingSetup.GET(FromVATBusPostingGr,FromVATProdPostingGr);

        CASE VATPostingSetup."VAT Calculation Type" OF
          VATPostingSetup."VAT Calculation Type"::"Reverse Charge VAT":
            VATPostingSetup."VAT %" := 0;
          VATPostingSetup."VAT Calculation Type"::"Sales Tax":
            ERROR(
              Text010,
              VATPostingSetup.FIELDCAPTION("VAT Calculation Type"),
              VATPostingSetup."VAT Calculation Type");
        END;

        CASE VATCalcType OF
          VATCalcType::"Normal VAT",
          VATCalcType::"Full VAT",
          VATCalcType::"Sales Tax":
            BEGIN
              IF PricesInclVAT THEN BEGIN
                IF VATBusPostingGr <> FromVATBusPostingGr THEN
                  UnitPrice := UnitPrice * (100 + VATPerCent) / (100 + VATPostingSetup."VAT %");
              END ELSE
                UnitPrice := UnitPrice / (1 + VATPostingSetup."VAT %" / 100);
            END;
          VATCalcType::"Reverse Charge VAT":
            UnitPrice := UnitPrice / (1 + VATPostingSetup."VAT %" / 100);
        END;
      END ELSE
        IF PricesInclVAT THEN
          UnitPrice := UnitPrice * (1 + VATPerCent / 100);
    END;

    LOCAL PROCEDURE ConvertPriceToUoM@5(UnitOfMeasureCode@1002 : Code[20];VAR UnitPrice@1001 : Decimal);
    BEGIN
      IF UnitOfMeasureCode = '' THEN
        UnitPrice := UnitPrice * QtyPerUOM;
    END;

    LOCAL PROCEDURE ConvertPriceLCYToFCY@6(CurrencyCode@1005 : Code[20];VAR UnitPrice@1001 : Decimal);
    VAR
      CurrExchRate@1000 : Record 330;
    BEGIN
      IF PricesInCurrency THEN BEGIN
        IF CurrencyCode = '' THEN
          UnitPrice :=
            CurrExchRate.ExchangeAmtLCYToFCY(ExchRateDate,Currency.Code,UnitPrice,CurrencyFactor);
        UnitPrice := ROUND(UnitPrice,Currency."Unit-Amount Rounding Precision");
      END ELSE
        UnitPrice := ROUND(UnitPrice,GLSetup."Unit-Amount Rounding Precision");
    END;

    LOCAL PROCEDURE CalcLineAmount@15(SalesPrice@1000 : Record 7002) : Decimal;
    BEGIN
      WITH SalesPrice DO BEGIN
        IF "Allow Line Disc." THEN
          EXIT("Unit Price" * (1 - LineDiscPerCent / 100));
        EXIT("Unit Price");
      END;
    END;

    LOCAL PROCEDURE PrintReportasPDF@1000000018(ReportUsage@1000 : 'S.Quote,S.Order,S.Invoice,S.Cr.Memo,S.Test,P.Quote,P.Order,P.Invoice,P.Cr.Memo,P.Receipt,P.Ret.Shpt.,P.Test,B.Stmt,B.Recon.Test,B.Check,Reminder,Fin.Charge,Rem.Test,F.C.Test,Prod. Order,S.Blanket,P.Blanket,M1,M2,M3,M4,Inv1,Inv2,Inv3,SM.Quote,SM.Order,SM.Invoice,SM.Credit Memo,SM.Contract Quote,SM.Contract,SM.Test,S.Return,P.Return,S.Shipment,S.Ret.Rcpt.,S.Work Order,Invt. Period Test,SM.Shipment,S.Test Prepmt.,P.Test Prepmt.,S.Arch. Quote,S.Arch. Order,P.Arch. Quote,P.Arch. Order,S. Arch. Return Order,P. Arch. Return Order,Asm. Order,P.Assembly Order,S.Order Pick Instruction';DocumentNo@1000000000 : Code[20];ExternalUserId@1000000011 : Text) : Text;
    VAR
      SalesInvHeader@1000000001 : Record 112;
      SalesCrMemoHeader@1000000002 : Record 114;
      SalesHeader@1000000003 : Record 36;
      ReportSelection@1000000004 : Record 77;
      tempfile@1000000006 : File;
      filename@1000000005 : Text;
      Istream@1000000010 : InStream;
      memorystream@1000000009 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      bytes@1000000008 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      convert@1000000007 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Convert";
      customer@1000000012 : Record 18;
    BEGIN
      GetCustomer(ExternalUserId, customer);
      tempfile.CREATETEMPFILE;
      filename := tempfile.NAME;
      tempfile.CLOSE();

      ReportSelection.RESET;
      ReportSelection.SETRANGE(Usage,ReportUsage);
      ReportSelection.FINDSET;
      REPEAT
        ReportSelection.TESTFIELD("Report ID");
        CASE ReportUsage OF
          ReportSelection.Usage::"S.Invoice":
            BEGIN
              CLEAR(SalesInvHeader);
              SalesInvHeader.SETRANGE("No.",DocumentNo);
              SalesInvHeader.SETRANGE("Sell-to Customer No.", customer."No.");
              SalesInvHeader.FINDSET(FALSE,FALSE);
              REPORT.SAVEASPDF(ReportSelection."Report ID",filename,SalesInvHeader);
            END;
          ReportSelection.Usage::"S.Cr.Memo":
            BEGIN
              CLEAR(SalesCrMemoHeader);
              SalesCrMemoHeader.SETRANGE("No.",DocumentNo);
              SalesCrMemoHeader.SETRANGE("Sell-to Customer No.", customer."No.");
              SalesCrMemoHeader.FINDSET(FALSE,FALSE);
              REPORT.SAVEASPDF(ReportSelection."Report ID",filename,SalesCrMemoHeader);
            END;
          ReportSelection.Usage::"S.Order":
            BEGIN
              CLEAR(SalesHeader);
              SalesHeader.SETRANGE(SalesHeader."Document Type",SalesHeader."Document Type"::Order);
              SalesHeader.SETRANGE("No.",DocumentNo);
              SalesHeader.SETRANGE("Sell-to Customer No.", customer."No.");
              REPORT.SAVEASPDF(ReportSelection."Report ID",filename,SalesHeader);
            END;
        END;
      UNTIL ReportSelection.NEXT = 0;

      IF EXISTS(filename) THEN BEGIN
        tempfile.OPEN(filename);
        tempfile.CREATEINSTREAM(Istream);
        memorystream := memorystream.MemoryStream();
        COPYSTREAM(memorystream,Istream);
        bytes := memorystream.GetBuffer();

        tempfile.CLOSE;
        FILE.ERASE(filename);

        EXIT(convert.ToBase64String(bytes));
      END;

      EXIT('fejl')
    END;

    LOCAL PROCEDURE GetList@1000000023(ReportUsage@1000000006 : Integer;CustomerID@1000000010 : Code[20];VAR Request@1000000001 : BigText;XMLdocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      SalesInvHeader@1000000009 : Record 112;
      SalesCrMemoHeader@1000000008 : Record 114;
      SalesHeader@1000000007 : Record 36;
      Header@1000000005 : Text[1000];
      XMLCurrNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocOut@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      i@1000000011 : Integer;
      pageSize@1000000012 : Integer;
      firstItem@1000000013 : Integer;
      customer@1000000014 : Record 18;
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><Items />';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      IF Get_TextFromNode(XMLdocIn.DocumentElement,'/GetList/@requestAmount') <> '' THEN BEGIN
        pageSize := TextToInteger(Get_TextFromNode(XMLdocIn.DocumentElement,'/GetList/@requestAmount'));
        firstItem := TextToInteger(Get_TextFromNode(XMLdocIn.DocumentElement,'/GetList/@firstItem'));
      END;

      GetCustomer(CustomerID, customer);

      CASE ReportUsage OF
        1: BEGIN
            Add_Attribute(XMLCurrNode,'type','OpenOrder');
            SalesHeader.SETRANGE("Document Type",SalesHeader."Document Type"::Order);
            SalesHeader.SETRANGE("Sell-to Customer No.",customer."No.");
            IF SalesHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              IF pageSize > 0 THEN BEGIN
                Add_Attribute(XMLCurrNode, 'totalCount', FORMAT(SalesHeader.COUNT));
                REPEAT
                  i := i + 1;
                  IF i >= firstItem THEN BEGIN
                    SalesHeader.CALCFIELDS(SalesHeader.Amount,SalesHeader."Amount Including VAT");
                    FillOrderItem(XMLCurrNode, SalesHeader."No.", SalesHeader."Order Date", SalesHeader."Shipment Date",
                      SalesHeader."Due Date", FORMAT(SalesHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                      SalesHeader."Posting Date", SalesHeader."Document Date");
                  END;
                UNTIL (SalesHeader.NEXT = 0) OR (i >= (firstItem + pageSize - 1));
              END ELSE BEGIN
                REPEAT
                  SalesHeader.CALCFIELDS(SalesHeader.Amount,SalesHeader."Amount Including VAT");
                  FillOrderItem(XMLCurrNode, SalesHeader."No.", SalesHeader."Order Date", SalesHeader."Shipment Date",
                      SalesHeader."Due Date", FORMAT(SalesHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                      SalesHeader."Posting Date", SalesHeader."Document Date");
                UNTIL SalesHeader.NEXT=0;
              END;
            END;
          END;
        2: BEGIN
            Add_Attribute(XMLCurrNode,'type','Invoice');
            SalesInvHeader.SETRANGE("Sell-to Customer No.", customer."No.");
            IF SalesInvHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              IF pageSize > 0 THEN BEGIN
                Add_Attribute(XMLCurrNode, 'totalCount', FORMAT(SalesInvHeader.COUNT));
                REPEAT
                  i := i + 1;
                  IF i >= firstItem THEN BEGIN
                    SalesInvHeader.CALCFIELDS(SalesInvHeader.Amount,SalesInvHeader."Amount Including VAT");
                    FillOrderItem(XMLCurrNode, SalesInvHeader."No.", SalesInvHeader."Order Date", SalesInvHeader."Shipment Date",
                      SalesInvHeader."Due Date", FORMAT(SalesInvHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesInvHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                      SalesInvHeader."Posting Date", SalesInvHeader."Document Date");
                  END;
                UNTIL (SalesInvHeader.NEXT = 0) OR (i >= (firstItem + pageSize - 1));
              END ELSE BEGIN
                REPEAT
                  SalesInvHeader.CALCFIELDS(SalesInvHeader.Amount,SalesInvHeader."Amount Including VAT");
                  FillOrderItem(XMLCurrNode, SalesInvHeader."No.", SalesInvHeader."Order Date", SalesInvHeader."Shipment Date",
                    SalesInvHeader."Due Date", FORMAT(SalesInvHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesInvHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                    SalesInvHeader."Posting Date", SalesInvHeader."Document Date");
                UNTIL SalesInvHeader.NEXT=0;
              END;
            END;
          END;
        3: BEGIN
          Add_Attribute(XMLCurrNode,'type','Credit');
            SalesCrMemoHeader.SETRANGE("Sell-to Customer No.", customer."No.");
            IF SalesCrMemoHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              IF pageSize > 0 THEN BEGIN
                Add_Attribute(XMLCurrNode, 'totalCount', FORMAT(SalesCrMemoHeader.COUNT));
                REPEAT
                  i := i + 1;
                  IF i >= firstItem THEN BEGIN
                    SalesCrMemoHeader.CALCFIELDS(SalesCrMemoHeader.Amount,SalesCrMemoHeader."Amount Including VAT");
                    FillOrderItem(XMLCurrNode, SalesCrMemoHeader."No.", SalesCrMemoHeader."Document Date", SalesCrMemoHeader."Shipment Date",
                      SalesCrMemoHeader."Due Date", FORMAT(SalesCrMemoHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesCrMemoHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                      SalesCrMemoHeader."Posting Date", SalesCrMemoHeader."Document Date");
                  END;
                UNTIL (SalesCrMemoHeader.NEXT = 0) OR (i >= (firstItem + pageSize - 1));
              END ELSE BEGIN
                REPEAT
                  SalesCrMemoHeader.CALCFIELDS(SalesCrMemoHeader.Amount,SalesCrMemoHeader."Amount Including VAT");
                    FillOrderItem(XMLCurrNode, SalesCrMemoHeader."No.", SalesCrMemoHeader."Document Date", SalesCrMemoHeader."Shipment Date",
                      SalesCrMemoHeader."Due Date", FORMAT(SalesCrMemoHeader.Amount,0,'<Precision,2:2><Standard Format,0>'), FORMAT(SalesCrMemoHeader."Amount Including VAT",0,'<Precision,2:2><Standard Format,0>'),
                      SalesCrMemoHeader."Posting Date", SalesCrMemoHeader."Document Date");
                UNTIL SalesCrMemoHeader.NEXT=0;
              END;
            END;
          END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE FillOrderItem@1000000046(XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";No@1000000002 : Text;OrderDate@1000000003 : Date;ShippingDate@1000000004 : Date;DueDate@1000000005 : Date;TotalAmountWithoutVat@1000000006 : Text;TotalAmountWithVat@1000000007 : Text;PostingDate@1000000008 : Date;DocumentDate@1000000009 : Date);
    VAR
      XMLNewChild@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLCurrNode,'item','','',XMLNewChild,'');
      Add_Field(XMLNewChild,'id',No);
      Add_Field(XMLNewChild,'orderDate',FORMAT(OrderDate,0,'<Year4>/<Month,2>/<Day,2>'));
      Add_Field(XMLNewChild,'shipDate',FORMAT(ShippingDate,0,'<Year4>/<Month,2>/<Day,2>'));
      Add_Field(XMLNewChild,'dueDate',FORMAT(DueDate,0,'<Year4>/<Month,2>/<Day,2>'));
      Add_Field(XMLNewChild,'postingDate',FORMAT(PostingDate,0,'<Year4>/<Month,2>/<Day,2>'));
      Add_Field(XMLNewChild,'documentDate',FORMAT(DocumentDate,0,'<Year4>/<Month,2>/<Day,2>'));
      Add_Field(XMLNewChild,'totalAmount',TotalAmountWithoutVat);
      Add_Field(XMLNewChild,'totalAmountIncVat',TotalAmountWithVat);
    END;

    LOCAL PROCEDURE GetItem@1000000015(ReportUsage@1000000003 : Integer;VAR Request@1000000001 : BigText;XMLdocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      DocumentNo@1000000002 : Code[20];
      SalesInvHeader@1000000011 : Record 112;
      SalesCrMemoHeader@1000000010 : Record 114;
      SalesHeader@1000000009 : Record 36;
      Header@1000000008 : Text[1000];
      XMLCurrNode@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocOut@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      salesline@1000000012 : Record 37;
      SalesInvLine@1000000013 : Record 113;
      SalesCrMemoLine@1000000014 : Record 115;
      Discount@1000000016 : Decimal;
      Total@1000000015 : Decimal;
      XmlOrderHeader@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      DocumentNo := Get_TextFromNode(XMLdocIn,'/GetItem/@documentNO');

      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><Items />';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      CASE ReportUsage OF
        1: BEGIN
            Total := 0;
            Discount := 0;
            Add_Attribute(XMLCurrNode,'type','OpenOrder');
            Add_Element(XMLCurrNode,'table','','',XmlOrderHeader,'');
            Add_Attribute(XmlOrderHeader,'tableName','EcomOrders');
            CLEAR(SalesHeader);
            SalesHeader.SETRANGE("Document Type",SalesHeader."Document Type"::Order);
            SalesHeader.SETRANGE("No.",DocumentNo);
            IF SalesHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              CLEAR(salesline);
              salesline.SETRANGE("Document Type",SalesHeader."Document Type");
              salesline.SETRANGE(salesline."Document No.",SalesHeader."No.");
              Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
              Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

              IF salesline.FINDSET(FALSE,FALSE) THEN
                REPEAT
                  Add_SalesLine(SalesHeader,salesline, XMLNewChild,'',TRUE,FALSE,'','');
                  IF (salesline."Line Discount Amount" <> 0) THEN
                      Add_SalesLine(SalesHeader,salesline,XMLNewChild,salesline."No.",TRUE,FALSE,'','');
                UNTIL salesline.NEXT=0;
                Add_SalesHeaderXml(SalesHeader,XmlOrderHeader,FALSE,Total,Discount,TRUE,FALSE);
            END;
          END;
        2: BEGIN
            Total := 0;
            Discount := 0;
            Add_Attribute(XMLCurrNode,'type','Invoice');
            Add_Element(XMLCurrNode,'table','','',XmlOrderHeader,'');
            Add_Attribute(XmlOrderHeader,'tableName','EcomOrders');
            CLEAR(SalesInvHeader);
            SalesInvHeader.SETRANGE("No.",DocumentNo);
            IF SalesInvHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              CLEAR(SalesInvLine);
              SalesInvLine.SETRANGE(SalesInvLine."Document No.",SalesInvHeader."No.");
              Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
              Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

              IF SalesInvLine.FINDSET(FALSE,FALSE) THEN
                REPEAT
                  Add_SalesInvLine(SalesInvHeader,SalesInvLine, XMLNewChild,'');
                  IF (SalesInvLine."Line Discount Amount" <> 0) THEN
                      Add_SalesInvLine(SalesInvHeader,SalesInvLine,XMLNewChild,SalesInvLine."No.");
                UNTIL SalesInvLine.NEXT=0;
              Add_SalesInvHeader(SalesInvHeader,XmlOrderHeader,Total,Discount);
            END;
          END;
        3: BEGIN
            Total := 0;
            Discount := 0;
            Add_Attribute(XMLCurrNode,'type','Credit');
            Add_Element(XMLCurrNode,'table','','',XmlOrderHeader,'');
            Add_Attribute(XmlOrderHeader,'tableName','EcomOrders');
            CLEAR(SalesCrMemoHeader);
            SalesCrMemoHeader.SETRANGE("No.",DocumentNo);
            IF SalesCrMemoHeader.FINDSET(FALSE,FALSE) THEN BEGIN
              CLEAR(SalesCrMemoLine);
              SalesCrMemoLine.SETRANGE(SalesCrMemoLine."Document No.",SalesCrMemoHeader."No.");
              Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
              Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

              IF SalesCrMemoLine.FINDSET(FALSE,FALSE) THEN
                REPEAT
                  Add_SalesCrMemoLine(SalesCrMemoHeader,SalesCrMemoLine, XMLNewChild,'');
                  IF (SalesCrMemoLine."Line Discount Amount" <> 0) THEN
                      Add_SalesCrMemoLine(SalesCrMemoHeader,SalesCrMemoLine,XMLNewChild,SalesCrMemoLine."No.");
                UNTIL SalesCrMemoLine.NEXT=0;
              Add_SalesCrMemoHeader(SalesCrMemoHeader,XmlOrderHeader,Total,Discount);
            END;
          END;
      END;

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE Add_AccessUserContact@3(XMLCurrNode@1002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1001 : Boolean;FilterNodes@1000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      Customer@1003 : Record 18;
      Contact@1004 : Record 5050;
      ContactBusiness@1005 : Record 5054;
      XMLNewChild@1006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Addresses@1007 : Record 222;
    BEGIN
      IF Contact.FINDSET(FALSE, FALSE) THEN BEGIN
        REPEAT
            ContactBusiness.SETRANGE("Contact No.", Contact."No.");
            IF (ContactBusiness.FIND('-')) THEN BEGIN
              REPEAT

              Customer.SETRANGE("No.", ContactBusiness."No.");
              IF (Customer.FIND('-')) THEN BEGIN
                REPEAT

                  Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
                  Add_Attribute(XMLNewChild,'table','AccessUser');
                  Add_Field(XMLNewChild,'AccessUserExternalID',FORMAT(Contact."No."));

                  Add_Field(XMLNewChild,'AccessUserCustomerNumber', Customer."No.");
                  Add_Field(XMLNewChild, 'AccessUserCompany', Customer.Name);
                  Add_Field(XMLNewChild,'AccessUserName',Contact.Name);
                  Add_Field(XMLNewChild,'AccessUserEmail',Contact."E-Mail");
                  Add_Field(XMLNewChild,'AccessUserPhone',Contact."Phone No.");
                  Add_Field(XMLNewChild,'AccessUserFax',Contact."Fax No.");
                  Add_Field(XMLNewChild,'AccessUserAddress',Contact.Address);
                  Add_Field(XMLNewChild,'AccessUserAddress2',Contact."Address 2");
                  Add_Field(XMLNewChild,'AccessUserZip',Contact."Post Code");
                  Add_Field(XMLNewChild,'AccessUserCity',Contact.City);
                  Add_Field(XMLNewChild,'AccessUserCountry',Contact.County);
                  Add_Field(XMLNewChild,'AccessUserCurrency',Contact."Currency Code");
                  Add_Field(XMLNewChild,'AccessUserType', '2');

                  IF (Customer.Blocked = Customer.Blocked::" ") THEN
                    Add_Field(XMLNewChild,'AccessUserActive','true')
                  ELSE
                    Add_Field(XMLNewChild,'AccessUserActive','false');

                  XMLNewChild := XMLNewChild.ParentNode;

                  UNTIL Customer.NEXT = 0;
              END;
            UNTIL ContactBusiness.NEXT = 0;
            END;
          UNTIL Contact.NEXT=0;
        END;
    END;

    LOCAL PROCEDURE Add_AccessUserAddress@8(XMLCurrNode@1002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";GetAll@1001 : Boolean;FilterNodes@1000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList");
    VAR
      XMLNewChild@1003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Addresses@1004 : Record 222;
      ContactAltAddress@1000000000 : Record 5051;
      Contact@1000000001 : Record 5050;
      ContactBusiness@1000000002 : Record 5054;
      Customer@1000000003 : Record 18;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','AccessUserAddress');

      //Add Contact address
      Contact.SETRANGE(Type, Contact.Type::Person);
      IF Contact.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          //Find Customer/Company number
          ContactBusiness.SETRANGE("Contact No.", Contact."Company No.");
          IF ContactBusiness.FINDFIRST AND Customer.GET(ContactBusiness."No.") AND (Contact."Company Name" = Customer.Name)THEN BEGIN
            Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
            Add_Attribute(XMLNewChild,'table','AccessUserAddress');
            Add_Field(XMLNewChild,'AccessUserAddressUserID',FORMAT(Contact."No."));
            Add_Field(XMLNewChild,'AccessUserAddressType', '1');
            Add_Field(XMLNewChild,'AccessUserAddressCallName','Contact Address');
            Add_Field(XMLNewChild,'AccessUserAddressCompany',Contact."Company Name");
            Add_Field(XMLNewChild,'AccessUserAddressName', 'Contact Address');
            Add_Field(XMLNewChild,'AccessUserAddressAddress',Contact.Address);
            Add_Field(XMLNewChild,'AccessUserAddressAddress2',Contact."Address 2");
            Add_Field(XMLNewChild,'AccessUserAddressZip',Contact."Post Code");
            Add_Field(XMLNewChild,'AccessUserAddressCity',Contact.City);
            Add_Field(XMLNewChild,'AccessUserAddressCountry',Contact."Country/Region Code");
            Add_Field(XMLNewChild,'AccessUserAddressCell',Contact."Mobile Phone No.");
            Add_Field(XMLNewChild,'AccessUserAddressFax',Contact."Fax No.");
            Add_Field(XMLNewChild,'AccessUserAddressEmail',Contact."E-Mail");

            Add_Field(XMLNewChild,'AccessUserAddressCustomerNumber',ContactBusiness."No.");

            Add_Field(XMLNewChild,'AccessUserAddressUID',Contact."No." + '_ContactAddress');
            Add_Field(XMLNewChild,'AccessUserAddressState',Contact."Country/Region Code");
            Add_Field(XMLNewChild,'AccessUserAddressPhoneBusiness', Contact."Phone No.");
            Add_Field(XMLNewChild,'AccessUserAddressCountryCode',Contact."Country/Region Code");
            Add_Field(XMLNewChild,'AccessUserAddressDefaultAddressCustomFields','False');

            XMLNewChild := XMLNewChild.ParentNode;

            ContactAltAddress.SETRANGE("Contact No.", Contact."No.");
            IF (ContactAltAddress.FINDSET(FALSE, FALSE)) THEN BEGIN
              REPEAT
                Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
                Add_Attribute(XMLNewChild,'table','AccessUserAddress');
                Add_Field(XMLNewChild,'AccessUserAddressUserID', ContactAltAddress."Contact No.");
                Add_Field(XMLNewChild,'AccessUserAddressType', '1');
                Add_Field(XMLNewChild,'AccessUserAddressCallName',ContactAltAddress.Code);
                Add_Field(XMLNewChild,'AccessUserAddressCompany',Contact."Company Name");
                Add_Field(XMLNewChild,'AccessUserAddressName',ContactAltAddress.Code);
                Add_Field(XMLNewChild,'AccessUserAddressAddress',ContactAltAddress.Address);
                Add_Field(XMLNewChild,'AccessUserAddressAddress2',ContactAltAddress."Address 2");
                Add_Field(XMLNewChild,'AccessUserAddressZip',ContactAltAddress."Post Code");
                Add_Field(XMLNewChild,'AccessUserAddressCity',ContactAltAddress.City);
                Add_Field(XMLNewChild,'AccessUserAddressCountry',ContactAltAddress."Country/Region Code");
                Add_Field(XMLNewChild,'AccessUserAddressCell',ContactAltAddress."Mobile Phone No.");
                Add_Field(XMLNewChild,'AccessUserAddressFax',ContactAltAddress."Fax No.");
                Add_Field(XMLNewChild,'AccessUserAddressEmail',ContactAltAddress."E-Mail");

                Add_Field(XMLNewChild,'AccessUserAddressCustomerNumber',ContactBusiness."No.");

                Add_Field(XMLNewChild,'AccessUserAddressUID',ContactAltAddress."Contact No." + '_' + ContactAltAddress.Code);
                Add_Field(XMLNewChild,'AccessUserAddressState',ContactAltAddress."Country/Region Code");
                Add_Field(XMLNewChild,'AccessUserAddressPhoneBusiness', ContactAltAddress."Phone No.");
                Add_Field(XMLNewChild,'AccessUserAddressCountryCode',ContactAltAddress."Country/Region Code");
                Add_Field(XMLNewChild,'AccessUserAddressDefaultAddressCustomFields','False');
                XMLNewChild := XMLNewChild.ParentNode;
              UNTIL ContactAltAddress.NEXT = 0;
            END;

          END
          ELSE BEGIN
            //Skip Contacts that do not belong to Customers
          END;
        UNTIL Contact.NEXT=0;
      END;

      CLEAR(Contact);
      CLEAR(ContactBusiness);

      //Ship-to Addresses
      IF (Addresses.FINDSET(FALSE, FALSE)) THEN BEGIN
        REPEAT
          //Add ship-to address to Company contacts
          ContactBusiness.SETRANGE("No.", Addresses."Customer No.");
          IF (ContactBusiness.FIND('-')) THEN BEGIN
            REPEAT
              Contact.SETRANGE("Company No.", ContactBusiness."Contact No.");
              Contact.SETRANGE(Type, Contact.Type::Person);
              IF (Contact.FIND('-')) THEN BEGIN
                REPEAT
                  IF Customer.GET(ContactBusiness."No.") AND (Contact."Company Name" = Customer.Name) THEN BEGIN
                    Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
                    Add_Attribute(XMLNewChild,'table','AccessUserAddress');
                    Add_Field(XMLNewChild,'AccessUserAddressUserID',FORMAT(Contact."No."));
                    Add_Field(XMLNewChild,'AccessUserAddressCompany',Contact."Company Name");
                    Add_Field(XMLNewChild,'AccessUserAddressCustomerNumber',ContactBusiness."No.");
                    Add_Field(XMLNewChild,'AccessUserAddressUID',Customer."No." + '_' + Addresses.Code);
                    FillAddress(XMLNewChild,Addresses);
                    XMLNewChild := XMLNewChild.ParentNode;
                  END;
                UNTIL Contact.NEXT = 0;
              END;
            UNTIL ContactBusiness.NEXT = 0;
          END;
        UNTIL Addresses.NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE Add_Impersonation@1000000030(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Customer@1000000002 : Record 18;
      Contact@1000000003 : Record 5050;
      bigtext@1000000004 : BigText;
      SalesPerson@1000000005 : Record 13;
      ContactBusiness@1000000006 : Record 5054;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','AccessUserSecondaryRelation');

      Contact.SETRANGE(Type, Contact.Type::Person);
      IF (SalesPerson.FINDSET(FALSE, FALSE)) THEN BEGIN
        REPEAT
          Contact.SETRANGE("Salesperson Code", SalesPerson.Code);
          IF Contact.FINDSET(FALSE,FALSE) THEN BEGIN
            REPEAT
              ContactBusiness.SETRANGE("Contact No.", Contact."Company No.");
              IF ContactBusiness.FINDFIRST AND Customer.GET(ContactBusiness."No.") AND (Contact."Company Name" = Customer.Name)
              THEN BEGIN
                Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
                Add_Attribute(XMLNewChild,'table','AccessUserSecondaryRelation');
                Add_Field(XMLNewChild,'AccessUserSecondaryRelationUserId',SalesPerson.Code);
                Add_Field(XMLNewChild,'AccessUserSecondaryRelationSecondaryUserId',Contact."No.");
                XMLNewChild := XMLNewChild.ParentNode;
              END;
            UNTIL Contact.NEXT = 0;
          END;
        UNTIL SalesPerson.NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE PrintCustomerStatementAsPDF@1000000024(CustomerID@1000000000 : Text;StrStartDate@1000000007 : Text;StrEndDate@1000000009 : Text) : Text;
    VAR
      tempfile@1000000001 : File;
      filename@1000000002 : Text;
      Istream@1000000003 : InStream;
      memorystream@1000000004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      bytes@1000000005 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      convert@1000000006 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Convert";
      StandardStatementReport@1000000008 : Report 1316;
      Customer@1000000010 : Record 18;
      startDate@1000000011 : Date;
      endDate@1000000012 : Date;
    BEGIN
      tempfile.CREATETEMPFILE;
      filename := tempfile.NAME;
      tempfile.CLOSE();

      IF (STRLEN(StrStartDate) < 1) OR (STRLEN(DELCHR(StrStartDate, '=','-')) < 8) THEN BEGIN
        ERROR('Start date must be in the YYYY-MM-DD format');
      END;
      IF (STRLEN(StrEndDate) < 1) OR (STRLEN(DELCHR(StrEndDate, '=','-')) < 8) THEN BEGIN
        ERROR('End date must be in the YYYY-MM-DD format');
      END;
      StrStartDate := DELCHR(StrStartDate, '=','-') + 'D';
      StrEndDate := DELCHR(StrEndDate, '=','-') + 'D';

      startDate := DMY2DATE(TextToInteger(COPYSTR(StrStartDate,7,2)),TextToInteger(COPYSTR(StrStartDate,5,2)),TextToInteger(COPYSTR(StrStartDate,1,4)));
      endDate := DMY2DATE(TextToInteger(COPYSTR(StrEndDate,7,2)),TextToInteger(COPYSTR(StrEndDate,5,2)),TextToInteger(COPYSTR(StrEndDate,1,4)));

      IF startDate > endDate THEN
        ERROR('Start date must be less than End date');

      Customer.SETRANGE("No.", CustomerID);
      Customer.FINDSET(FALSE, FALSE);
      StandardStatementReport.InitializeRequest(TRUE,TRUE,TRUE,TRUE,TRUE,FALSE,'<1M+CM>',0,TRUE, startDate, endDate);
      StandardStatementReport.SETTABLEVIEW(Customer);
      StandardStatementReport.SAVEASPDF(filename);

      IF EXISTS(filename) THEN BEGIN
        tempfile.OPEN(filename);
        tempfile.CREATEINSTREAM(Istream);
        memorystream := memorystream.MemoryStream();
        COPYSTREAM(memorystream,Istream);
        bytes := memorystream.GetBuffer();

        tempfile.CLOSE;
        FILE.ERASE(filename);

        EXIT(convert.ToBase64String(bytes));
      END;

      EXIT('Fail to get PDF from PrintCustomerStatementAsPDF')
    END;

    LOCAL PROCEDURE TextToInteger@1000000070(VarText@1000000000 : Text) : Integer;
    VAR
      VarInteger@1000000001 : Integer;
    BEGIN
      EVALUATE(VarInteger,VarText);
      EXIT(VarInteger);
    END;

    LOCAL PROCEDURE Get_BoolFromNode@1000000040(XmlNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";xpath@1000000002 : Text) : Boolean;
    VAR
      tempbool@1000000001 : Boolean;
      tempstr@1000000003 : Text;
    BEGIN
      tempstr:=Get_TextFromNode(XmlNode,xpath);
      IF (LOWERCASE(tempstr) = 'true') OR (tempstr = '1') OR (LOWERCASE(tempstr) = 'on') THEN EXIT(TRUE)
      ELSE EXIT(FALSE);
      //EXIT(EVALUATE(tempbool,Get_TextFromNode(XmlNode,xpath)));
    END;

    LOCAL PROCEDURE Add_Locations@1000000035(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      Location@1000000001 : Record 14;
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      id@1000000003 : Integer;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomStockLocation');

      IF Location.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomStockLocation');
          id := ConvertCodeToInt(Location.Code);
          Add_Field(XMLNewChild,'StockLocationId',FORMAT(id));
          Add_Field(XMLNewChild,'StockLocationName',Location.Code);
          IF Location.Name <> '' THEN
            Add_Field(XMLNewChild,'StockLocationDescription',Location.Name)
          ELSE
            Add_Field(XMLNewChild,'StockLocationDescription',Location.Code);
          Add_Field(XMLNewChild,'StockLocationLanguageId',DefaultLanguageId);
          Add_Field(XMLNewChild,'StockLocationGroupId',FORMAT(id));

          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL Location.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE ConvertCodeToInt@1000000036(code@1000000000 : Code[20]) : Integer;
    VAR
      i@1000000004 : Integer;
      dotNetString@1000000005 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
    BEGIN
      dotNetString := code;
      i := dotNetString.GetHashCode();
      IF i < 0 THEN
        i := (-1) * i;
      EXIT(i);
    END;

    LOCAL PROCEDURE Add_StockUnits@1000000044(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000002 : Record 27;
      Location@1000000007 : Record 14;
      ItemAvailFormsMgt@1000000008 : Codeunit 353;
      GrossRequirement@1000000012 : Decimal;
      PlannedOrderRcpt@1000000013 : Decimal;
      ScheduledRcpt@1000000014 : Decimal;
      PlannedOrderReleases@1000000015 : Decimal;
      ProjAvailableBalance@1000000016 : Decimal;
      ExpectedInventory@1000000017 : Decimal;
      QtyAvailable@1000000018 : Decimal;
      unitId@1000000003 : Text;
      Calendar@1000000004 : Record 2000000007;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomStockUnit');

      item.SETRANGE("Date Filter",Calendar."Period Start",Calendar."Period End");
      IF Location.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          item.SETRANGE("Location Filter",Location.Code);
          IF item.FINDSET(FALSE,FALSE) THEN BEGIN
            REPEAT
              unitId := item."Base Unit of Measure";
              ItemAvailFormsMgt.CalcAvailQuantities(
                item,
                FALSE,
                GrossRequirement,PlannedOrderRcpt,ScheduledRcpt,
                PlannedOrderReleases,ProjAvailableBalance,ExpectedInventory,QtyAvailable);
              IF item.Inventory <> 0 THEN BEGIN
                Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
                Add_Attribute(XMLNewChild,'table','EcomStockUnit');
                Add_Field(XMLNewChild,'StockUnitProductId',item."No.");
                Add_Field(XMLNewChild,'StockUnitVariantId','');
                Add_Field(XMLNewChild,'StockUnitId',STRSUBSTNO('Unit_%1',unitId));
                Add_Field(XMLNewChild,'StockUnitQuantity',FORMAT(item.Inventory));
                Add_Field(XMLNewChild,'StockUnitStockLocationId',FORMAT(ConvertCodeToInt(Location.Code)));
                XMLNewChild := XMLNewChild.ParentNode;
              END;
            UNTIL item.NEXT=0;
          END;
        UNTIL Location.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_ProductsStock@1000000038(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000002 : Record 27;
      itemvariants@1000000003 : Record 5401;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomProducts');

      IF item.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_ProductStock(XMLNewChild,item,'');
          CLEAR(itemvariants);
          itemvariants.SETFILTER(itemvariants."Item No.",'=%1', item."No.");
          IF itemvariants.FINDSET(FALSE,FALSE) THEN BEGIN
            REPEAT
              Add_ProductStock(XMLNewChild,item,itemvariants.Code);
            UNTIL itemvariants.NEXT=0;
          END;
        UNTIL item.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_ProductStock@1000000041(XMLNewChildProd@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";item@1000000007 : Record 27;variant@1000000000 : Text[30]);
    VAR
      itemLedgerEntry@1000000001 : Record 32;
    BEGIN
      item."Variant Filter" := variant;
      item.CALCFIELDS(item.Inventory);
      Add_Element(XMLNewChildProd,'item','','',XMLNewChildProd,'');
      Add_Attribute(XMLNewChildProd,'table','EcomProducts');
      Add_Field(XMLNewChildProd,'ProductID',item."No.");

      IF (variant <> '') THEN
        Add_Field(XMLNewChildProd,'ProductVariantID',variant)
      ELSE
        Add_Field(XMLNewChildProd,'ProductVariantID','');

      Add_Field(XMLNewChildProd,'ProductNumber',item."No.");

      IF (variant <> '') THEN BEGIN
        itemLedgerEntry.SETFILTER("Item No.", '=%1', item."No.");
        itemLedgerEntry.SETFILTER("Variant Code", '=%1', variant);
        itemLedgerEntry.CALCSUMS(Quantity);
        Add_Field(XMLNewChildProd,'ProductStock',FORMAT(itemLedgerEntry.Quantity));
      END ELSE BEGIN
        Add_Field(XMLNewChildProd,'ProductStock',FORMAT(item.Inventory));
      END;
      XMLNewChildProd := XMLNewChildProd.ParentNode;
    END;

    LOCAL PROCEDURE Add_Units@1000000039(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Language@1000000017 : Record 8;
      UnitofMeasure@1000000008 : Record 204;
      unitofmeasuretranslation@1000000009 : Record 5402;
    BEGIN
          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomVariantGroups');
      IF Language.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomVariantGroups');
          Add_Field(XMLNewChild,'VariantGroupID','NavUnits');
          Add_Field(XMLNewChild,'VariantGroupLanguageID',Language.Code);
          Add_Field(XMLNewChild,'VariantGroupName','DW_Units');
          Add_Field(XMLNewChild,'VariantGroupLabel','');
          Add_Field(XMLNewChild,'VariantGroupUnit','true');

          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL Language.NEXT=0;
      END ELSE BEGIN
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','EcomVariantGroups');
          Add_Field(XMLNewChild,'VariantGroupID','NavUnits');
          Add_Field(XMLNewChild,'VariantGroupLanguageID','');
          Add_Field(XMLNewChild,'VariantGroupName','DW_Units');
          Add_Field(XMLNewChild,'VariantGroupLabel','');
          Add_Field(XMLNewChild,'VariantGroupUnit','true');

          XMLNewChild := XMLNewChild.ParentNode;
      END;

      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','EcomVariantsOptions');
      CLEAR(UnitofMeasure);
      IF UnitofMeasure.FINDSET(FALSE,FALSE) THEN BEGIN
        REPEAT
          CLEAR(unitofmeasuretranslation);
          unitofmeasuretranslation.SETRANGE(Code,UnitofMeasure.Code);
          unitofmeasuretranslation.SETFILTER("Language Code",'=%1', DefaultLanguageId);
          IF NOT unitofmeasuretranslation.FINDFIRST() THEN BEGIN
            Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
            Add_Attribute(XMLNewChild,'table','EcomVariantsOptions');
            Add_Field(XMLNewChild,'VariantOptionID',STRSUBSTNO('Unit_%1',UnitofMeasure.Code));
            Add_Field(XMLNewChild,'VariantOptionLanguageID',DefaultLanguageId);
            Add_Field(XMLNewChild,'VariantOptionGroupID','NavUnits');
            Add_Field(XMLNewChild,'VariantOptionName',UnitofMeasure.Description);
            XMLNewChild := XMLNewChild.ParentNode;
          END;
          unitofmeasuretranslation.SETFILTER("Language Code",'');
          IF unitofmeasuretranslation.FINDSET(FALSE,FALSE) THEN BEGIN
            REPEAT
              Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
              Add_Attribute(XMLNewChild,'table','EcomVariantsOptions');
              Add_Field(XMLNewChild,'VariantOptionID',STRSUBSTNO('Unit_%1',UnitofMeasure.Code));
              Add_Field(XMLNewChild,'VariantOptionLanguageID',unitofmeasuretranslation."Language Code");
              Add_Field(XMLNewChild,'VariantOptionGroupID','NavUnits');
              Add_Field(XMLNewChild,'VariantOptionName',unitofmeasuretranslation.Description);
              XMLNewChild := XMLNewChild.ParentNode;
            UNTIL unitofmeasuretranslation.NEXT=0;
          END;
        UNTIL UnitofMeasure.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Add_ProductProperties@1000000088(VAR item@1000000002 : Record 27;XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR itemAttributesList@1000000012 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";XMLCurrNode@1000000011 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldValue@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryField@1000000013 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldTranslation@1000000010 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOption@1000000009 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryFieldOptionTranslation@1000000008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategory@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";XMLNewChildProductCategoryTranslation@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";languagesList@1000000005 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1";setLanguage@1000000006 : Text);
    VAR
      ItemAttributes@1000000026 : Record 7500;
      ItemAttributeValues@1000000027 : Record 7501;
      ItemAttributeValueMapping@1000000030 : Record 7505;
      itemCategoryCode@1000000018 : Text;
      ItemAttributeValueMapping1@1000000003 : Record 7505;
    BEGIN
      ItemAttributeValueMapping.SETRANGE("Table ID", DATABASE::Item);
      ItemAttributeValueMapping.SETFILTER("No.", '=%1',item."No.");
      IF ItemAttributeValueMapping.FINDSET(FALSE, FALSE) THEN BEGIN
      REPEAT
        CLEAR(ItemAttributeValues);
        ItemAttributeValues.SETFILTER("Attribute ID",FORMAT(ItemAttributeValueMapping."Item Attribute ID"));
        ItemAttributeValues.SETFILTER(ID, FORMAT(ItemAttributeValueMapping."Item Attribute Value ID"));
        ItemAttributeValues.SETFILTER(Value, '<>%1', '');
        IF ItemAttributeValues.FINDFIRST THEN BEGIN
          IF ItemAttributes.GET(ItemAttributeValueMapping."Item Attribute ID") THEN BEGIN
            //Add category field definition tables
            IF NOT itemAttributesList.Contains(ItemAttributeValueMapping."Item Attribute ID") THEN BEGIN
              itemAttributesList.Add(ItemAttributeValueMapping."Item Attribute ID");
              IF itemAttributesList.Count = 1 THEN BEGIN
                Add_ProductCategoryAndFieldsXmlNodes(XMLCurrNode,XMLNewChildProductCategory, XMLNewChildProductCategoryTranslation, XMLNewChildProductCategoryField ,XMLNewChildProductCategoryFieldTranslation,
                  XMLNewChildProductCategoryFieldOption, XMLNewChildProductCategoryFieldOptionTranslation,XMLNewChildProductCategoryFieldValue, languagesList, setLanguage);
              END;
              CLEAR(ItemAttributeValueMapping1);
              ItemAttributeValueMapping1.SETRANGE("Table ID", DATABASE::"Item Category");
              ItemAttributeValueMapping1.SETRANGE("Item Attribute ID", ItemAttributeValueMapping."Item Attribute ID");
              IF ItemAttributeValueMapping1.FINDFIRST THEN BEGIN
                  Add_EcomProductCategoryField(ItemAttributes,ItemAttributeValueMapping1."Item Attribute Value ID",XMLNewChildProductCategoryField,XMLNewChildProductCategoryFieldTranslation,
                    XMLNewChildProductCategoryFieldOption,XMLNewChildProductCategoryFieldOptionTranslation, 'ImportedNAVItemAttributes', languagesList, setLanguage);
                END ELSE BEGIN
                  Add_EcomProductCategoryField(ItemAttributes,0,XMLNewChildProductCategoryField,XMLNewChildProductCategoryFieldTranslation,
                    XMLNewChildProductCategoryFieldOption,XMLNewChildProductCategoryFieldOptionTranslation, 'ImportedNAVItemAttributes', languagesList, setLanguage);
              END;
            END;

            itemCategoryCode := 'ImportedNAVItemAttributes';
            Add_Element(XMLNewChildProductCategoryFieldValue,'item','','',XMLNewChildProductCategoryFieldValue,'');
            Add_Attribute(XMLNewChildProductCategoryFieldValue,'table','EcomProductCategoryFieldValue');
            Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueFieldId',itemCategoryCode + '_' + FORMAT(ItemAttributeValueMapping."Item Attribute ID"));
            Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueFieldCategoryId',itemCategoryCode);
            Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueProductId',ItemAttributeValueMapping."No.");
            Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueProductVariantId','');
            Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueProductLanguageId', setLanguage);
            IF ItemAttributes.Type = ItemAttributes.Type::Option THEN
              Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueValue', FORMAT(ItemAttributeValues.ID))
            ELSE
              Add_Field(XMLNewChildProductCategoryFieldValue,'FieldValueValue',ItemAttributeValues.Value);
            XMLNewChildProductCategoryFieldValue := XMLNewChildProductCategoryFieldValue.ParentNode;
          END;
        END;
      UNTIL ItemAttributeValueMapping.NEXT=0;
      END;
    END;

    LOCAL PROCEDURE Get_RequestLanguages@1000000050(languages@1000000000 : Text;VAR languagesList@1000000001 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.List`1");
    VAR
      Language@1000000017 : Record 8;
      strLanguages@1000000002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
      separator@1000000004 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
      i@1000000005 : Integer;
      languagesArray@1000000006 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      strLanguage@1000000003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
    BEGIN
      languagesList := languagesList.List();
      strLanguages := languages;
      IF strLanguages.Length > 0 THEN BEGIN
        separator := ',';
        languagesArray := strLanguages.Split(separator.ToCharArray());
        FOR i := 0 TO languagesArray.Length - 1 DO BEGIN
          strLanguage := languagesArray.GetValue(i);
          strLanguage := strLanguage.Trim();
          IF Language.GET(strLanguage) AND NOT languagesList.Contains(Language.Code) THEN BEGIN
            languagesList.Add(Language.Code);
          END;
        END;
      END;
    END;

    LOCAL PROCEDURE WriteNote@1000000051(NoteText@1001 : Text;salesHeader@1002 : Record 36);
    VAR
      LinkID@1240060000 : Integer;
      RecRef@1240060002 : RecordRef;
      RecordLink@1240060003 : Record 2000000068;
      typeHelper@1000000000 : Codeunit 10;
    BEGIN
      RecRef.GETTABLE(salesHeader);
      RecordLink.INIT;
      RecordLink."Link ID" := 0;
      RecordLink."Record ID" := RecRef.RECORDID;
      RecordLink.URL1 := GETURL(CLIENTTYPE::Current, COMPANYNAME, OBJECTTYPE::Page, PAGE::"Sales Order");
      RecordLink.Type := RecordLink.Type::Note;
      RecordLink.Created := CURRENTDATETIME;
      RecordLink."User ID":= USERID;
      RecordLink.Company:= COMPANYNAME;
      RecordLink.Notify := TRUE;
      //NAV2018:
      typeHelper.WriteRecordLinkNote(RecordLink, NoteText);
      //Used in NAV2015:
      //SetText(NoteText,RecordLink);
      RecordLink.INSERT;
    END;

    LOCAL PROCEDURE SetText@1000000052(NoteText@1001 : Text;VAR RecordLink@1000 : Record 2000000068);
    VAR
      SystemUTF8Encoder@1011 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Text.UTF8Encoding";
      SystemByteArray@1010 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      OStr@1008 : OutStream;
      s@1007 : Text;
      lf@1006 : Text;
      c1@1005 : Char;
      c2@1004 : Char;
      x@1003 : Integer;
      y@1002 : Integer;
      i@1009 : Integer;
    BEGIN
      s := NoteText;
      SystemUTF8Encoder := SystemUTF8Encoder.UTF8Encoding;
      SystemByteArray := SystemUTF8Encoder.GetBytes(s);

      RecordLink.Note.CREATEOUTSTREAM(OStr);
      x := SystemByteArray.Length DIV 128;
      IF x > 1 THEN
        y := SystemByteArray.Length - 128 * (x - 1)
      ELSE
        y := SystemByteArray.Length;
      c1 := y;
      OStr.WRITE(c1);
      IF x > 0 THEN BEGIN
        c2 := x;
        OStr.WRITE(c2);
      END;
      FOR i := 0 TO SystemByteArray.Length - 1 DO BEGIN
        c1 := SystemByteArray.GetValue(i);
        OStr.WRITE(c1);
      END;
    END;

    LOCAL PROCEDURE GetSalesLineDiscountNoteText@1000000054(XMLNodeDiscount@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";salesLineNo@1000000001 : Integer;VAR dwOrderLineIds@1000000008 : ARRAY [10000,2] OF Text;CurrencyCode@1000000007 : Text) : Text;
    VAR
      noteText@1000000002 : Text;
      i@1000000005 : Integer;
      arrayLength@1000000010 : Integer;
      str@1000000011 : Text;
      CRLF@1000000003 : Text[2];
      discountValue@1000000004 : Text;
      discountType@1000000006 : Text;
    BEGIN
      IF (Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountType'']') = 'Product') THEN BEGIN
        str := Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineParentLineId'']');
        IF (str <> '') THEN BEGIN
          arrayLength := ARRAYLEN(dwOrderLineIds, 1);
          FOR i := 1 TO arrayLength DO BEGIN
            IF dwOrderLineIds[i][1] = '' THEN
              i := arrayLength
            ELSE IF dwOrderLineIds[i][1] = str THEN BEGIN
                EVALUATE(salesLineNo,dwOrderLineIds[i][2]);
                i := arrayLength;
              END;
          END;
        END;
      END;
      CRLF := ' ';
      CRLF[1] := 13;
      CRLF[2] := 10;
      discountType := Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountType'']');
      discountValue := Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountValue'']');
      IF discountType = 'Percentage' THEN
        discountValue := discountValue + '%'
      ELSE IF discountType = 'Amount' THEN
        discountValue := discountValue + ' ' + CurrencyCode;
      noteText := STRSUBSTNO('Line: %1. Applied Dynamicweb Discount. %2Name: "%3" %2Campaign: "%4" %2Type: %5 %2Value: %6',
      salesLineNo, CRLF,
      Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountName'']'),
      Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineCampaignName'']'),
      discountType,
      discountValue);
      EXIT(noteText);
    END;

    LOCAL PROCEDURE HtmlEncode@1000000059(InText@1000000000 : Text) : Text;
    VAR
      SystemWebHttpUtility@1000000001 : DotNet "'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.System.Web.HttpUtility";
    BEGIN
      SystemWebHttpUtility := SystemWebHttpUtility.HttpUtility;
      EXIT(SystemWebHttpUtility.HtmlEncode(InText));
    END;

    LOCAL PROCEDURE Add_ProductDefaultGroup@1000000048(groupId@1000000006 : Text;itemNo@1000000002 : Text;XMLNewChildGroupProductRelation@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    BEGIN
      Add_Element(XMLNewChildGroupProductRelation,'item','','',XMLNewChildGroupProductRelation,'');
      Add_Attribute(XMLNewChildGroupProductRelation,'table','EcomGroupProductRelation');
      Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationGroupID',groupId);
      Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationProductID',itemNo);
      Add_Field(XMLNewChildGroupProductRelation,'GroupProductRelationIsPrimary','True');
      XMLNewChildGroupProductRelation := XMLNewChildGroupProductRelation.ParentNode;
    END;

    LOCAL PROCEDURE Add_DynamicwebShippingItemCharge@1000000033();
    VAR
      itemCharge@1000000000 : Record 5800;
    BEGIN
      IF NOT itemCharge.GET(DynamicwebShippingItemChargeNo) THEN BEGIN
        itemCharge.INIT;
        itemCharge."No." := DynamicwebShippingItemChargeNo;
        itemCharge.Description := 'Dynamicweb Ecommerce Shipping Charge';
        itemCharge."Search Description" := UPPERCASE(itemCharge.Description);
        itemCharge.INSERT;
      END;
    END;

    LOCAL PROCEDURE Add_Shipping@1000000067(VAR XMLOrderNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR RequestXMLOrderNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";lineNo@1000000002 : Integer;VAR salesHeader@1000000008 : Record 36;insertShippingOrderLine@1000000010 : Boolean;firstOrderLineItem@1000000014 : Record 27);
    VAR
      itemCharge@1000000007 : Record 5800;
      dynamicwebOrderShippingItemKey@1000000006 : Text;
      dynamicwebShippingFee@1000000005 : Decimal;
      dynamicwebShippingWarning@1000000004 : Text;
      dynamicwebControlsShipping@1000000003 : Boolean;
      salesLine@1000000009 : Record 37;
      dynamicwebShippingFeeWithoutVat@1000000011 : Decimal;
      itemChargeAssignment@1000000012 : Record 5809;
    BEGIN
      dynamicwebControlsShipping := NOT ISNULL(RequestXMLOrderNode.SelectSingleNode('column[@columnName=''OrderShippingItemKey'']'));
      IF dynamicwebControlsShipping THEN BEGIN
        dynamicwebShippingFee := Get_DecimalFromNode(RequestXMLOrderNode, 'column[@columnName=''OrderShippingFee'']');
        IF dynamicwebShippingFee <> 0 THEN BEGIN
          dynamicwebShippingFeeWithoutVat := Get_DecimalFromNode(RequestXMLOrderNode, 'column[@columnName=''OrderShippingFeeWithoutVat'' or @columnName=''OrderShippingFeeWithoutVAT'']');
          IF (dynamicwebShippingFeeWithoutVat = 0) THEN
             dynamicwebShippingFeeWithoutVat := dynamicwebShippingFee;
          Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + dynamicwebShippingFee;
          Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + dynamicwebShippingFeeWithoutVat;

        IF insertShippingOrderLine THEN BEGIN
          dynamicwebOrderShippingItemKey := Get_TextFromNode(RequestXMLOrderNode, 'column[@columnName=''OrderShippingItemKey'']');
          IF dynamicwebOrderShippingItemKey <> '' THEN
            IF itemCharge.GET(dynamicwebOrderShippingItemKey) THEN BEGIN
              //Add Dynamicweb shipping fee order line
              salesLine.INIT;
              salesLine."Document Type" := salesHeader."Document Type";
              salesLine."Document No." := salesHeader."No.";
              salesLine."Line No." := lineNo;
              salesLine.Type := salesLine.Type::"Charge (Item)";
              salesLine."No." := itemCharge."No.";
              salesLine.Description := itemCharge.Description;
              salesLine."Qty. Assigned" := 1;
              IF salesHeader."Prices Including VAT" THEN BEGIN
                  salesLine."Unit Price" := dynamicwebShippingFee;
              END ELSE BEGIN
                  salesLine."Unit Price" := dynamicwebShippingFeeWithoutVat;
              END;
              salesLine.VALIDATE(Quantity, 1);
              IF salesHeader."Prices Including VAT" THEN BEGIN
                  salesLine."Line Amount" := dynamicwebShippingFee;
              END ELSE BEGIN
                  salesLine."Line Amount" := dynamicwebShippingFeeWithoutVat;
                  salesLine."VAT Base Amount" := dynamicwebShippingFee - dynamicwebShippingFeeWithoutVat;
                  salesLine."VAT Difference" := dynamicwebShippingFee - dynamicwebShippingFeeWithoutVat;
              END;
              salesLine.VALIDATE(Amount, dynamicwebShippingFeeWithoutVat);
              salesLine."Amount Including VAT" := dynamicwebShippingFee;
              salesLine."VAT Prod. Posting Group" := itemCharge."VAT Prod. Posting Group";
              salesLine."Gen. Bus. Posting Group" := salesHeader."Gen. Bus. Posting Group";
              salesLine."Gen. Prod. Posting Group" := firstOrderLineItem."Gen. Prod. Posting Group";
              salesLine."VAT Bus. Posting Group" := salesHeader."VAT Bus. Posting Group";
              salesLine."Dimension Set ID" := salesHeader."Dimension Set ID";
              salesLine.INSERT(TRUE);
              itemChargeAssignment.INIT;
              itemChargeAssignment."Document Type" := itemChargeAssignment."Document Type"::Order;
              itemChargeAssignment."Document No." := salesHeader."No.";
              itemChargeAssignment."Applies-to Doc. No." := salesHeader."No.";
              itemChargeAssignment."Document Line No." := salesLine."Line No.";
              itemChargeAssignment."Line No." := 10000;
              itemChargeAssignment."Applies-to Doc. Line No." := 10000;
              itemChargeAssignment."Item Charge No." := itemCharge."No.";
              itemChargeAssignment."Unit Cost" := dynamicwebShippingFeeWithoutVat;
              itemChargeAssignment."Amount to Assign" := dynamicwebShippingFeeWithoutVat;
              itemChargeAssignment."Item No." := firstOrderLineItem."No.";
              itemChargeAssignment.Description := firstOrderLineItem.Description;
              itemChargeAssignment."Qty. to Assign" := 1;
              itemChargeAssignment.INSERT();
            END ELSE BEGIN
              dynamicwebShippingWarning := STRSUBSTNO('Can not add Dynamicweb shipping cost to NAV Sales order due to missing item charge:"%1"', dynamicwebOrderShippingItemKey);
              Add_Field(XMLOrderNode,'OrderShippingWarning',dynamicwebShippingWarning);
            END;
        END;
        END;
        Add_Field(XMLOrderNode,'OrderShippingMethodName',Get_TextFromNode(RequestXMLOrderNode, 'column[@columnName=''OrderShippingMethodName'']'));
        Add_Field(XMLOrderNode,'OrderShippingMethodId',Get_TextFromNode(RequestXMLOrderNode, 'column[@columnName=''OrderShippingMethodId'']'));
        Add_Field(XMLOrderNode,'OrderShippingFee',FORMAT(dynamicwebShippingFee))
      END ELSE BEGIN
        Add_Field(XMLOrderNode,'OrderShippingMethodName',salesHeader."Shipment Method Code");
      END;
    END;

    LOCAL PROCEDURE Add_SalesHeaderXml@1000000058(salesheader@1000000000 : Record 36;VAR XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";tempoary@1000000003 : Boolean;VAR Total@1000000005 : Decimal;VAR Discount@1000000004 : Decimal;FromCustomerCenter@1000000006 : Boolean;calculateOrderIF2@1000000008 : Boolean);
    VAR
      prefix@1000000007 : Text;
      XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLCurrNode,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrders');
      Add_SalesHeader(salesheader, XMLNewChild, tempoary, Total, Discount, FromCustomerCenter, calculateOrderIF2);
    END;

    LOCAL PROCEDURE GetInvoiceDiscountPercent@1000000060(VAR SalesHeader@1000 : Record 36;VAR OrderPriceWithoutVAT@1001 : Decimal) : Decimal;
    VAR
      CurrencyDate@1000000002 : Date;
      CustInvDisc@1000000003 : Record 19;
    BEGIN
      IF SalesHeader."Posting Date" = 0D THEN
          CurrencyDate := WORKDATE
      ELSE
        CurrencyDate := SalesHeader."Posting Date";

      CustInvDisc.GetRec(SalesHeader."Invoice Disc. Code",SalesHeader."Currency Code",CurrencyDate,OrderPriceWithoutVAT);
      EXIT(CustInvDisc."Discount %");
    END;

    LOCAL PROCEDURE Add_NavOrderDiscountSalesLine@1000000065(VAR XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";discountAmount@1000000001 : Decimal;VAR VATPostingSetup@1000000008 : Record 325;salesheader@1000000000 : Record 36;invoiceDiscountAmountWithVat@1000000009 : Decimal;anyLineHasDifferentVatPercent@1000000010 : Boolean);
    VAR
      TempWithWAT@1000000006 : Decimal;
      TempWithoutWAT@1000000007 : Decimal;
      VatPercent@1000000011 : Decimal;
    BEGIN
      VatPercent := 0;
      IF VATPostingSetup."VAT Calculation Type" <> VATPostingSetup."VAT Calculation Type"::"Reverse Charge VAT" THEN
        VatPercent := VATPostingSetup."VAT %";
      Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrderLines');
      Add_Field(XMLNewChild,'OrderLineProductNumber','');
      Add_Field(XMLNewChild,'OrderLineProductVariantId','');
      Add_Field(XMLNewChild,'OrderLineId','');
      Add_Field(XMLNewChild,'OrderLineQuantity','1');
      Add_Field(XMLNewChild,'OrderLineType','1');

      TempWithoutWAT := discountAmount;
      Add_Field(XMLNewChild,'OrderLinePriceWithoutVat',FORMAT(TempWithoutWAT));
      Add_Field(XMLNewChild,'OrderLineUnitPriceWithoutVat',FORMAT(TempWithoutWAT));
      Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT - TempWithoutWAT;

      IF anyLineHasDifferentVatPercent THEN BEGIN
          TempWithWAT := invoiceDiscountAmountWithVat;
          VatPercent := ROUND((TempWithWAT - TempWithoutWAT) * 100 / TempWithoutWAT, 0.01, '=');
      END ELSE BEGIN
          TempWithWAT := ROUND(TempWithoutWAT * (1 + (VatPercent / 100)), 0.01, '=');
      END;
      Order_OrderPriceWithVAT := Order_OrderPriceWithVAT - TempWithWAT;
      Add_Field(XMLNewChild,'OrderLinePriceWithVat',FORMAT(TempWithWAT));
      Add_Field(XMLNewChild,'OrderLineUnitPriceWithVat',FORMAT(TempWithWAT));

      Order_OrderPriceVAT := Order_OrderPriceWithVAT-Order_OrderPriceWithoutVAT;
      Add_Field(XMLNewChild,'OrderLinePriceVat',FORMAT(ROUND(TempWithWAT - TempWithoutWAT, 0.01, '=')));
      Add_Field(XMLNewChild,'OrderLineUnitPriceVat',FORMAT(ROUND(TempWithWAT - TempWithoutWAT, 0.01, '=')));

      Add_Field(XMLNewChild,'OrderLinePriceVatPercent',FORMAT(VatPercent));
      Add_Field(XMLNewChild,'OrderLineUnitPriceVatPercent',FORMAT(VatPercent));

      XMLNewChild := XMLNewChild.ParentNode;
    END;

    PROCEDURE CalculateIncDiscForHeader@1000000066(VAR TempSalesHeader@1000 : Record 36;VAR discountAmountWithVat@1000000003 : Decimal;VAR anyLineHasDifferentVatPercent@1000000004 : Boolean);
    VAR
      SalesCalcDiscount@1000000000 : Codeunit 60;
      SalesLine@1000000001 : Record 37;
      discount@1000000002 : Decimal;
      localVatPercent@1000000005 : Decimal;
    BEGIN
      SalesLine.SETRANGE("Document Type", TempSalesHeader."Document Type");
      SalesLine.SETRANGE("Document No.", TempSalesHeader."No.");

      IF SalesLine.FINDFIRST() THEN BEGIN
          localVatPercent := SalesLine."VAT %";
          SalesCalcDiscount.CalculateInvoiceDiscountOnLine(SalesLine);
      END;

      IF SalesLine.FINDSET(TRUE) THEN
          REPEAT
              discount := discount + SalesLine."Inv. Discount Amount";
              discountAmountWithVat := discountAmountWithVat + ROUND((SalesLine."Inv. Discount Amount" * (1 + (SalesLine."VAT %" / 100))), 0.01, '=');
              IF SalesLine."VAT %" <> localVatPercent THEN
                    anyLineHasDifferentVatPercent := TRUE;
          UNTIL SalesLine.NEXT() = 0;
      TempSalesHeader."Invoice Discount Amount" := discount;
    END;

    LOCAL PROCEDURE Add_DynamicwebOrderDiscountSalesLine@1000000081(VAR XMLNewChild@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR XMLDiscountNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR VATPostingSetup@1000000001 : Record 325);
    VAR
      TempWithWAT@1000000006 : Decimal;
      TempWithoutWAT@1000000007 : Decimal;
      VatPercent@1000000008 : Decimal;
    BEGIN
      VatPercent := 0;
      IF VATPostingSetup."VAT Calculation Type" <> VATPostingSetup."VAT Calculation Type"::"Reverse Charge VAT" THEN
        VatPercent := VATPostingSetup."VAT %";
      Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'table','EcomOrderLines');
      Add_Field(XMLNewChild,'OrderLineProductNumber','');
      Add_Field(XMLNewChild,'OrderLineProductName',Get_TextFromNode(XMLDiscountNode, 'column[@columnName=''OrderLineProductName'']'));
      Add_Field(XMLNewChild,'OrderLineProductVariantId','');
      Add_Field(XMLNewChild,'OrderLineProductName',Get_TextFromNode(XMLDiscountNode, 'column[@columnName=''OrderLineDiscountId'']'));
      Add_Field(XMLNewChild,'OrderLineQuantity','1');
      Add_Field(XMLNewChild,'OrderLineType','1');

      TempWithoutWAT := Get_DecimalFromNode(XMLDiscountNode, 'column[@columnName=''OrderLinePriceWithoutVat'' or @columnName=''OrderLinePriceWithoutVAT'']');
      TempWithWAT := ROUND(TempWithoutWAT * (1 + (VatPercent / 100)), 0.01, '=');

      Add_Field(XMLNewChild,'OrderLinePriceWithoutVat',FORMAT(TempWithoutWAT));
      Add_Field(XMLNewChild,'OrderLineUnitPriceWithoutVat',FORMAT(Get_DecimalFromNode(XMLDiscountNode, 'column[@columnName=''OrderLineUnitPriceWithoutVat'' or @columnName=''OrderLineUnitPriceWithoutVAT'']')));

      Order_OrderPriceWithVAT := Order_OrderPriceWithVAT + TempWithWAT;
      Order_OrderPriceWithoutVAT := Order_OrderPriceWithoutVAT + TempWithoutWAT;
      Order_OrderPriceVAT := Order_OrderPriceWithVAT - Order_OrderPriceWithoutVAT;

      XMLNewChild := XMLNewChild.ParentNode;
    END;

    LOCAL PROCEDURE GetCustomer@1000000055(customerNo@1000000000 : Text;VAR customer@1000000002 : Record 18);
    BEGIN
      IF NOT customer.GET(customerNo) THEN BEGIN
        customer.SETFILTER(Name, '=%1', customerNo);
        IF NOT customer.FINDFIRST() THEN
          ERROR(STRSUBSTNO('Customer with name: %1 not found', customerNo));
      END;
    END;

    LOCAL PROCEDURE GetVersion@1000000053() : Text;
    VAR
      appManagement@1000000002 : Codeunit 1;
      result@1000000006 : Text;
      pos@1000000000 : Integer;
      i@1000000001 : Integer;
      navVersion@1000000003 : Decimal;
    BEGIN
      result := appManagement.ApplicationVersion();
      result := DELCHR(result,'=',DELCHR(result,'=',' 1234567890.'));
      pos := STRPOS(result, ' ') + 1;
      IF pos > 1 THEN BEGIN
        i := pos;
        WHILE i < STRLEN(result) DO BEGIN
          IF COPYSTR(result, i, 1) = ' ' THEN
            pos := i + 1;
          i := i + 1;
        END;
        result := COPYSTR(result, pos);
      END;
      IF NOT EVALUATE(navVersion, result) THEN
        result := '1.0'
      ELSE IF navVersion >= 13 THEN
        result := '1.0';
      result := Version + '_NAV' + result + '.' + appManagement.ApplicationBuild();
      EXIT(result)
    END;

    LOCAL PROCEDURE GetUOMCode@1000000057(uom@1000000000 : Text) : Text;
    BEGIN
      IF uom <> '' THEN BEGIN
        IF STRPOS(uom, 'Unit_') = 1 THEN
          EXIT(COPYSTR(uom, 6))
        ELSE
          EXIT(uom);
      END ELSE
        EXIT('');
    END;

    LOCAL PROCEDURE GetProductPrices@1000000019(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";salesType@1000000001 : Text;salesCode@1000000002 : Text;language@1000000003 : Text;currency@1000000012 : Text;uom@1000000017 : Text);
    VAR
      XMLNewChild@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      item@1000000005 : Record 27;
      itemvariants@1000000006 : Record 5401;
      SalesPrice@1000000007 : Record 7002;
      salesTypeOption@1000000008 : Option;
      unitPrice@1000000009 : Text;
      sPrice@1000000010 : Text;
      recordLanguage@1000000011 : Record 8;
      CurrExchRate@1000000013 : Record 330;
      glSetup@1000000014 : Record 98;
      currencyFactor@1000000015 : Decimal;
      CurencyRecord@1000000016 : Record 4;
      unitOfMeasure@1000000018 : Text;
      XmlPricesNode@1000000019 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
        IF (language = '') THEN
          language := recordLanguage.GetUserLanguage;
        IF (salesType <> '') THEN BEGIN
            salesTypeOption := GetSalesType(salesType);
        END;
        currencyFactor := 1;
        glSetup.GET;
        IF ((currency <> '') AND (currency <> glSetup."LCY Code")) THEN BEGIN
            CurencyRecord.GET(currency);
            currencyFactor := CurrExchRate.ExchangeRate(TODAY, CurencyRecord.Code);
        END;

        Add_Element(XMLCurrNode, 'table', '', '', XMLNewChild, '');
        Add_Attribute(XMLNewChild, 'tableName', 'EcomProducts');
        IF (salesType <> '') THEN BEGIN
            Add_Element(XMLCurrNode, 'table', '', '', XmlPricesNode, '');
            Add_Attribute(XmlPricesNode, 'tableName', 'EcomPrices');
        END;
        IF item.FINDSET(FALSE, FALSE) THEN BEGIN
          REPEAT
            IF ((currency <> '') AND (currency <> glSetup."LCY Code")) THEN BEGIN
              unitPrice := FORMAT(ROUND(CurrExchRate.ExchangeAmtLCYToFCY(TODAY, currency, item."Unit Price", currencyFactor),
              CurencyRecord."Unit-Amount Rounding Precision"));
            END ELSE
              unitPrice := FORMAT(item."Unit Price");

            IF (salesType <> '') THEN BEGIN
                IF uom <> '' THEN unitOfMeasure := uom ELSE unitOfMeasure := item."Base Unit of Measure";
                sPrice := GetSalesPrice(item."No.", '', salesTypeOption, salesCode, item."Base Unit of Measure", currency);
                AddProductPrice(item, XMLNewChild, language, '', (sPrice <> ''), unitPrice, sPrice);
                AddProductEcomPrice(XmlPricesNode, item."No.", '', language, currency, unitPrice, '1', TRUE, 0D, 0D, unitOfMeasure, '', '', '');
                AddProductSalesPrices(XmlPricesNode, item."No.", '', unitOfMeasure, language, currency, salesTypeOption, salesCode);
            END ELSE BEGIN
                AddProductPrice(item, XMLNewChild, language, '', FALSE, unitPrice, '');
            END;

            CLEAR(itemvariants);
            itemvariants.SETFILTER(itemvariants."Item No.", '=%1', item."No.");
            IF itemvariants.FINDSET(FALSE, FALSE) THEN BEGIN
              REPEAT
                IF (salesType <> '') THEN BEGIN
                    sPrice := GetSalesPrice(item."No.", itemvariants.Code, salesTypeOption, salesCode, item."Base Unit of Measure", currency);
                    AddProductPrice(item, XMLNewChild, language, itemvariants.Code, (sPrice <> ''), unitPrice, sPrice);
                    AddProductEcomPrice(XmlPricesNode, item."No.", itemvariants.Code, language, currency, unitPrice, '1', TRUE, 0D, 0D, unitOfMeasure, '', '', '');
                    AddProductSalesPrices(XmlPricesNode, item."No.", itemvariants.Code, unitOfMeasure, language, currency, salesTypeOption, salesCode);
                END ELSE BEGIN
                    AddProductPrice(item, XMLNewChild, language, itemvariants.Code, FALSE, unitPrice, '');
                END;
              UNTIL itemvariants.NEXT = 0;
            END;
          UNTIL item.NEXT = 0;
        END;
    END;

    LOCAL PROCEDURE GetSalesType@1000000056(salesType@1000000000 : Text) : Integer;
    VAR
      SalesPrice@1000000001 : Record 7002;
    BEGIN
      CASE LOWERCASE(salesType) OF
        LOWERCASE('Customer'):
            EXIT(SalesPrice."Sales Type"::Customer);
        LOWERCASE('Customer Price Group'):
            EXIT(SalesPrice."Sales Type"::"Customer Price Group");
        LOWERCASE('All Customers'):
            EXIT(SalesPrice."Sales Type"::"All Customers");
        LOWERCASE('Campaign'):
            EXIT(SalesPrice."Sales Type"::Campaign);
      END;
      ERROR('Sales type %1 not found', salesType);
    END;

    LOCAL PROCEDURE GetSalesPrice@1000000061(itemNo@1000000000 : Text;variant@1000000001 : Text;salesType@1000000002 : Option;salesCode@1000000003 : Text;baseUOM@1000000004 : Text;currency@1000000009 : Text) : Text;
    VAR
      SalesPrice@1000000005 : Record 7002;
      languageUnit@1000000006 : Record 8;
      sPrice@1000000007 : Text;
      foundPrice@1000000008 : Decimal;
    BEGIN
      SalesPrice.SETFILTER("Item No.", '=%1', itemNo);
      SalesPrice.SETFILTER("Sales Type", '=%1', salesType);
      SalesPrice.SETFILTER("Sales Code", '=%1', salesCode);
      SalesPrice.SETFILTER("Variant Code", '=%1', variant);
      IF baseUOM <> '' THEN
          SalesPrice.SETFILTER("Unit of Measure Code", '%1|%2', baseUOM, '');
      SalesPrice.SETFILTER("Ending Date", '%1|>=%2', 0D, DT2DATE(CURRENTDATETIME));
      SalesPrice.SETFILTER("Starting Date", '%1|<=%2', 0D, DT2DATE(CURRENTDATETIME));
      SalesPrice.SETFILTER("Minimum Quantity", '<=%1', 1);
      SalesPrice.SETFILTER("Currency Code", '=%1', currency);
      IF SalesPrice.FINDSET(FALSE, FALSE) THEN BEGIN
        REPEAT
            IF ((sPrice = '') OR (foundPrice > SalesPrice."Unit Price")) THEN BEGIN
                foundPrice := SalesPrice."Unit Price";
                sPrice := FORMAT(foundPrice);
            END;
        UNTIL SalesPrice.NEXT = 0;
        EXIT(sPrice);
      END ELSE
        EXIT('');
    END;

    LOCAL PROCEDURE AddProductPrice@1000000062(item@1000000000 : Record 27;VAR XMLNewChildProd@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";language@1000000002 : Text;variant@1000000003 : Text;useCampaignsPrices@1000000004 : Boolean;basePrice@1000000005 : Text;salesPrice@1000000006 : Text);
    BEGIN
      Add_Element(XMLNewChildProd, 'item', '', '', XMLNewChildProd, '');
      Add_Attribute(XMLNewChildProd, 'table', 'EcomProducts');
      Add_Field(XMLNewChildProd, 'ProductID', item."No.");
      IF (variant <> '') THEN
          Add_Field(XMLNewChildProd, 'ProductVariantID', variant)
      ELSE
          Add_Field(XMLNewChildProd, 'ProductVariantID', '');
      Add_Field(XMLNewChildProd, 'ProductLanguageID', language);
      Add_Field(XMLNewChildProd, 'ProductNumber', item."No.");
      IF useCampaignsPrices THEN BEGIN
          Add_Field(XMLNewChildProd, 'ProductPrice', salesPrice);
          Add_Field(XMLNewChildProd, 'ProductPriceBefore', basePrice);
      END ELSE BEGIN
          Add_Field(XMLNewChildProd, 'ProductPrice', basePrice);
      END;
      XMLNewChildProd := XMLNewChildProd.ParentNode;
    END;

    LOCAL PROCEDURE PutEcomOrder@1000000049(XMLdocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";XMLNode@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR XMLdocOut@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR XMLCurrNode@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode") : Text;
    VAR
      XMLNodeListDiscount@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      customer@1000000005 : Record 18;
      useDynamicwebDiscount@1000000006 : Boolean;
      customerName@1000000007 : Text;
      message@1000000008 : Text;
    BEGIN
      useDynamicwebDiscount := NOT Get_BoolFromNode(XMLNode, 'column[@columnName=''ErpControlsDiscount'']');
      IF useDynamicwebDiscount THEN BEGIN
          XMLNodeListDiscount := XMLdocIn.SelectNodes('/PutEcomOrders/table[@tableName=''EcomOrderLines'']/item[column[@columnName=''OrderLineOrderID''] = ''' +
              Get_TextFromNode(XMLNode, 'column[@columnName=''OrderID'']') + ''']');
      END;
      customerName := Get_TextFromNode(XMLNode, 'column[@columnName=''OrderCustomerNumber'']');
      IF (customerName <> '') THEN BEGIN
          GetCustomer(customerName, customer);
          message := CreateOrder(XMLNode, XMLdocIn, XMLCurrNode, useDynamicwebDiscount, XMLNodeListDiscount,
              Get_TextFromNode(XMLNode, 'column[@columnName=''OrderCurrencyCode'']'), customer, FALSE);
          IF message <> '' THEN EXIT(message);
      END ELSE
          EXIT('Customer name can not be empty');
      EXIT('');
    END;

    LOCAL PROCEDURE CreateOrder@1000000063(XMLOrderNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR XMLdocIn@1000000006 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR XMLCurrNode@1000000042 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";useDynamicwebDiscount@1000000043 : Boolean;XMLNodeListDiscount@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";orderCurrencyCode@1000000044 : Text;customer@1000000045 : Record 18;isLiveIntegrationRequest@1000000046 : Boolean) : Text;
    VAR
      XMLNodeListLines@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      XMLNode@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNodeDiscount@1000000014 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      salesheader@1000000005 : Record 36;
      salesline@1000000010 : Record 37;
      XMLNewChild@1000000009 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      lineno@1000000011 : Integer;
      pricemgt@1000000021 : Codeunit 7000;
      TempSalesPrice@1000000020 : TEMPORARY Record 7002;
      TempSalesLineDisc@1000000019 : TEMPORARY Record 7004;
      TempSalesHeader@1000000018 : TEMPORARY Record 36;
      TempSalesLine@1000000017 : TEMPORARY Record 37;
      VATPostingSetup@1000000016 : Record 325;
      Discount@1000000024 : Decimal;
      Total@1000000025 : Decimal;
      PriceCalcMgt@1000000026 : Codeunit 7000;
      CurrExchRate@1000000027 : Record 330;
      dynamicwebDiscountAmount@1000000030 : Decimal;
      totalDynamicwebDiscountAmount@1000000032 : Decimal;
      dwProductDiscountSalesLine@1000000029 : Record 37;
      dwOrderLineIds@1000000033 : ARRAY [10000,2] OF Text;
      arrayCounter@1000000034 : Integer;
      productOrderLinesCount@1000000037 : Integer;
      uom@1000000038 : Text;
      itemUOM@1000000039 : Record 5404;
      firstOrderLineItem@1000000041 : Record 27;
      u@1000000001 : Integer;
      j@1000000002 : Integer;
      itemNo@1000000003 : Text;
      item@1000000007 : Record 27;
      invoiceDiscountAmountWithVat@1000000008 : Decimal;
      anyLineHasDifferentVatPercent@1000000047 : Boolean;
    BEGIN
      Total := 0;
      Discount := 0;

      CLEAR(salesheader);
      salesheader.INIT;
      salesheader."Document Type" := salesheader."Document Type"::Order;
      salesheader."No." := '';
      salesheader.INSERT(TRUE);

      salesheader.VALIDATE("Sell-to Customer No.", customer."No.");

      IF (customer."Bill-to Customer No." <> '') THEN
        salesheader.VALIDATE("Bill-to Customer No.", customer."Bill-to Customer No.");

      salesheader.VALIDATE("Sell-to Address" ,Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerAddress'']'));
      salesheader.VALIDATE("Sell-to Address 2", Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerAddress2'']'));
      salesheader.VALIDATE("Sell-to Post Code" ,Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerZip'']'));
      salesheader.VALIDATE("Sell-to City" ,Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderCustomerCity'']'));

      salesheader.VALIDATE("Ship-to Name" ,Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryName'']'));
      salesheader.VALIDATE("Ship-to Address" ,Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryAddress'']'));
      salesheader.VALIDATE("Ship-to Address 2", Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryAddress2'']'));
      salesheader.VALIDATE("Ship-to Post Code" , Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryZip'']'));
      salesheader.VALIDATE("Ship-to City" , Get_TextFromNode(XMLOrderNode,'column[@columnName=''OrderDeliveryCity'']'));
      IF Currency.GET(orderCurrencyCode) THEN BEGIN
          salesheader.VALIDATE("Currency Code" , orderCurrencyCode);
      END;

      salesheader.MODIFY(TRUE);

      lineno := 0;
      arrayCounter := 1;

      IF isLiveIntegrationRequest THEN
        XMLNodeListLines := XMLdocIn.SelectNodes('/tables/table[@tableName=''EcomOrderLines'']/item')
      ELSE
        XMLNodeListLines := XMLdocIn.SelectNodes('/PutEcomOrders/table[@tableName=''EcomOrderLines'']/item[column[@columnName=''OrderLineOrderID''] = ''' + Get_TextFromNode(XMLOrderNode, 'column[@columnName=''OrderID'']') + ''']');

      IF useDynamicwebDiscount THEN BEGIN
        //Calculate number of product order lines
        FOR u := 0 TO XMLNodeListLines.Count() - 1  DO BEGIN
          XMLNode := XMLNodeListLines.ItemOf(u);
          IF (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductId'' or @columnName=''OrderLineProductID'']') <> '') AND (
            (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') = '2') OR (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') = '0'))THEN
            productOrderLinesCount := productOrderLinesCount + 1;
        END;
      END;

      IF isLiveIntegrationRequest THEN BEGIN
          Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      END ELSE BEGIN
          XMLNewChild := XMLCurrNode.OwnerDocument.CreateNode('element', 'dummy', '');
          Add_Element(XMLNewChild, 'table', '', '', XMLNewChild, '');
      END;

      Add_Attribute(XMLNewChild,'tableName','EcomOrderLines');

      FOR u := 0 TO XMLNodeListLines.Count() - 1  DO BEGIN
        XMLNode := XMLNodeListLines.ItemOf(u);
        IF Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductId'' or @columnName=''OrderLineProductID'']') <> '' THEN BEGIN
          salesline.INIT;
          salesline."Document Type" := salesheader."Document Type";
          salesline."Document No." := salesheader."No.";
          lineno += 10000;
          salesline."Line No." := lineno;
          salesline.Type := salesline.Type::Item;
          itemNo := DELCHR(Get_TextFromNode(XMLNode, 'column[@columnName=''OrderLineProductId'' or @columnName=''OrderLineProductID'']'), '=', '(|)');
          IF NOT item.GET(itemNo) THEN BEGIN
            IF isLiveIntegrationRequest THEN
                ERROR('Item %1 does not exists', itemNo)
            ELSE
                EXIT(STRSUBSTNO('Item %1 does not exists', itemNo));
          END;
          salesline.INSERT(TRUE);
          salesline.VALIDATE("No.", itemNo);
          salesline.VALIDATE("Variant Code", GetTextFromNode(XMLNode, 'column[@columnName=''OrderLineProductVariantId'']', MAXSTRLEN(salesline."Variant Code")));
          uom := GetUOMCode(Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineUnitId'' or @columnName=''OrderLineUnitID'']'));
          IF uom <> '' THEN BEGIN
            salesline.VALIDATE("Unit of Measure Code",  uom);
          END ELSE BEGIN
            salesline.VALIDATE("Unit of Measure Code", item."Base Unit of Measure");
          END;
          salesline.VALIDATE(Quantity,Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLineQuantity'']'));

          IF u = 0 THEN
            firstOrderLineItem := item;

          VATPostingSetup.GET(customer."VAT Bus. Posting Group",item."VAT Prod. Posting Group");

          IF useDynamicwebDiscount THEN BEGIN
            dynamicwebDiscountAmount := 0;
            totalDynamicwebDiscountAmount := 0;
            salesline.VALIDATE("Line Discount %", 0);

            IF Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') <> '3' THEN BEGIN
              dwOrderLineIds[arrayCounter][1] := Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineId'' or @columnName=''OrderLineID'']');
              dwOrderLineIds[arrayCounter][2] := FORMAT(salesline."Line No.");
              arrayCounter := arrayCounter + 1;

              FOR j := 0 TO XMLNodeListDiscount.Count - 1  DO BEGIN
                XMLNodeDiscount := XMLNodeListDiscount.ItemOf(j);

                IF (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineId'' or @columnName=''OrderLineID'']') = Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineParentLineId'' or @columnName=''OrderLineParentLineID'']')) AND
                  (Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductId'' or @columnName=''OrderLineProductID'']') = '') THEN BEGIN
                  //handle orderline discount
                  dynamicwebDiscountAmount := -Get_DecimalFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineUnitPriceWithoutVat'' or @columnName=''OrderLineUnitPriceWithoutVAT'']');
                  IF dynamicwebDiscountAmount <> 0 THEN BEGIN
                    totalDynamicwebDiscountAmount := totalDynamicwebDiscountAmount + dynamicwebDiscountAmount;
                    salesline.VALIDATE("Line Discount %",
                      ROUND((dynamicwebDiscountAmount / Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLinePriceWithoutVat'' or @columnName=''OrderLinePriceWithoutVAT'']')) * 100, 0.01, '='));
                    Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,TRUE,
                      Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineDiscountId'' or @columnName=''OrderLineDiscountID'']'), Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineProductName'']'));
                    WriteNote(GetSalesLineDiscountNoteText(XMLNodeDiscount, salesline."Line No.", dwOrderLineIds, orderCurrencyCode), salesheader);
                  END;
                END ELSE IF (Get_TextFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineType'']') = '1') THEN BEGIN
                  //handle order discounts
                  dynamicwebDiscountAmount := -Get_DecimalFromNode(XMLNodeDiscount,'column[@columnName=''OrderLineUnitPriceWithoutVat'' or @columnName=''OrderLineUnitPriceWithoutVAT'']');
                  IF productOrderLinesCount > 1 THEN
                    dynamicwebDiscountAmount := ROUND(dynamicwebDiscountAmount / productOrderLinesCount, 0.01, '=');
                  IF dynamicwebDiscountAmount <> 0 THEN BEGIN
                    totalDynamicwebDiscountAmount := totalDynamicwebDiscountAmount + dynamicwebDiscountAmount;
                    dynamicwebDiscountAmount := totalDynamicwebDiscountAmount;
                    salesline.VALIDATE("Line Discount %",
                      ROUND((dynamicwebDiscountAmount / Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLinePriceWithoutVat'' or @columnName=''OrderLinePriceWithoutVAT'']')) * 100, 0.01, '='));
                    WriteNote(GetSalesLineDiscountNoteText(XMLNodeDiscount, salesline."Line No.", dwOrderLineIds, orderCurrencyCode), salesheader);
                  END;
                END;
              END;
              IF (totalDynamicwebDiscountAmount <> 0) AND (totalDynamicwebDiscountAmount <> dynamicwebDiscountAmount) THEN BEGIN
                  salesline.VALIDATE("Line Discount %",
                    ROUND((totalDynamicwebDiscountAmount / Get_DecimalFromNode(XMLNode,'column[@columnName=''OrderLinePriceWithoutVat'' or @columnName=''OrderLinePriceWithoutVAT'']')) * 100, 0.01, '='));
              END;
            END ELSE BEGIN
              salesline.VALIDATE("Unit Price", 0);
            END;
          END;
          salesline.MODIFY(TRUE);

          IF (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') <> '3') THEN BEGIN
            Add_SalesLine(salesheader, salesline,XMLNewChild,'',FALSE,TRUE,'','');
          END ELSE BEGIN
            Add_SalesLine(salesheader, salesline,XMLNewChild,Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineParentLineId'' or @columnName=''OrderLineParentLineID'']'),FALSE,TRUE,
              Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineDiscountId'' or @columnName=''OrderLineDiscountID'']'),Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineProductName'']'));
              IF useDynamicwebDiscount THEN BEGIN
                WriteNote(GetSalesLineDiscountNoteText(XMLNode, salesline."Line No.", dwOrderLineIds, orderCurrencyCode), salesheader);
              END;
          END;

          IF (salesline."Line Discount Amount" <> 0) THEN
            IF NOT useDynamicwebDiscount THEN
              Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,TRUE, '','');
            //ELSE
              //Add_SalesLine(salesheader,salesline,XMLNewChild,salesline."No.",FALSE,TRUE, 'empty','empty');
        END ELSE IF (Get_TextFromNode(XMLNode,'column[@columnName=''OrderLineType'']') = '1') AND useDynamicwebDiscount THEN BEGIN
          //handle DW Order discount order lines
          Add_DynamicwebOrderDiscountSalesLine(XMLNewChild, XMLNode, VATPostingSetup);
        END;
      END;
      IF NOT useDynamicwebDiscount THEN BEGIN
        CalculateIncDiscForHeader(salesheader, invoiceDiscountAmountWithVat, anyLineHasDifferentVatPercent);
        IF salesheader."Invoice Discount Amount" > 0 THEN BEGIN
          salesheader.MODIFY();
          Add_NavOrderDiscountSalesLine(XMLNewChild, salesheader."Invoice Discount Amount", VATPostingSetup, salesheader, invoiceDiscountAmountWithVat, anyLineHasDifferentVatPercent);
        END;
      END;

      IF (isLiveIntegrationRequest) THEN BEGIN
        Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
        Add_Attribute(XMLNewChild,'tableName','EcomOrders');
        Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
        Add_Attribute(XMLNewChild,'table','EcomOrders');
        lineno += 10000;
        Add_Shipping(XMLNewChild, XMLOrderNode, lineno, salesheader, TRUE, firstOrderLineItem);
        Add_SalesHeader(salesheader,XMLNewChild,FALSE,Total,Discount,FALSE,TRUE);
      END ELSE BEGIN
        Add_Element(XMLCurrNode, 'order', '', '', XMLNewChild,'');
        Add_Element(XMLNewChild, 'OrderID',
        Get_TextFromNode(XMLOrderNode, 'column[@columnName=''OrderID'']'), '', XMLNode,'');
        Add_Element(XMLNewChild, 'externalOrderId', salesheader."No.", '', XMLNode,'');
      END;
    END;

    LOCAL PROCEDURE AddProductSalesPrices@1000000069(VAR XmlPricesNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";itemNo@1000000001 : Text;variant@1000000002 : Text;uom@1000000003 : Text;language@1000000004 : Text;currency@1000000007 : Text;salesType@1000000008 : Option;salesCode@1000000009 : Text);
    VAR
      SalesPrice@1000000005 : Record 7002;
    BEGIN
      SalesPrice.SETFILTER("Item No.", '=%1', itemNo);
      SalesPrice.SETFILTER("Variant Code", '=%1', variant);
      SalesPrice.SETFILTER("Sales Type", '=%1', salesType);
      SalesPrice.SETFILTER("Sales Code", '=%1', salesCode);
      IF uom <> '' THEN
          SalesPrice.SETFILTER("Unit of Measure Code", '%1|%2', uom, '');
      IF currency <> '' THEN
          SalesPrice.SETFILTER("Currency Code", '=%1', currency);

      IF SalesPrice.FINDSET(FALSE, FALSE) THEN BEGIN
          REPEAT
              AddProductEcomPrice(XmlPricesNode, itemNo, variant, language, SalesPrice."Currency Code", FORMAT(SalesPrice."Unit Price"),
              FORMAT(SalesPrice."Minimum Quantity"), FALSE, SalesPrice."Starting Date", SalesPrice."Ending Date", uom, '', SalesPrice."Sales Code", FORMAT(SalesPrice."Sales Type"));
          UNTIL SalesPrice.NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE AddProductEcomPrice@1000000071(VAR XmlPricesNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";itemNo@1000000001 : Text;variant@1000000002 : Text;language@1000000003 : Text;currency@1000000004 : Text;price@1000000005 : Text;quantity@1000000006 : Text;isInformaive@1000000007 : Boolean;startDate@1000000008 : Date;endDate@1000000009 : Date;uom@1000000010 : Text;customerNumber@1000000011 : Text;salesCode@1000000012 : Text;salesType@1000000013 : Text);
    VAR
      glSetup@1000000014 : Record 98;
      pXmlNode@1000000015 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      glSetup.GET;
      Add_Element(XmlPricesNode, 'item', '', '', pXmlNode, '');
      Add_Attribute(pXmlNode, 'table', 'EcomPrices');
      Add_Field(pXmlNode, 'PriceId',
          DELCHR(
              STRSUBSTNO('%1%2%3%4%5%6%7%8%9', itemNo, variant, language, currency, quantity, FORMAT(startDate, 0, '<Year4><Month,2><Day,2>'), uom, salesCode, salesType),
              '=', '(|)|'''));
      Add_Field(pXmlNode, 'PriceProductId', itemNo);
      IF (variant <> '') THEN
          Add_Field(pXmlNode, 'PriceProductVariantId', variant)
      ELSE
          Add_Field(pXmlNode, 'PriceProductVariantId', '');
      Add_Field(pXmlNode, 'PriceProductLanguageId', language);
      IF (currency = '') THEN
          Add_Field(pXmlNode, 'PriceCurrency', glSetup."LCY Code")
      ELSE
          Add_Field(pXmlNode, 'PriceCurrency', currency);
      Add_Field(pXmlNode, 'PriceQuantity', quantity);
      Add_Field(pXmlNode, 'PriceAmount', price);
      Add_Field(pXmlNode, 'PriceUnitId', uom);
      IF startDate = 0D THEN
          Add_Field(pXmlNode, 'PriceValidFrom', '')
      ELSE
          Add_Field(pXmlNode, 'PriceValidFrom', FORMAT(startDate, 0, '<Year4>/<Month,2>/<Day,2>'));
      IF endDate = 0D THEN
          Add_Field(pXmlNode, 'PriceValidTo', '')
      ELSE
          Add_Field(pXmlNode, 'PriceValidTo', FORMAT(endDate, 0, '<Year4>/<Month,2>/<Day,2>'));
      IF isInformaive THEN Add_Field(pXmlNode, 'PriceIsInformative', 'true') ELSE Add_Field(pXmlNode, 'PriceIsInformative', 'false');
      Add_Field(pXmlNode, 'PriceUserCustomerNumber', customerNumber);
    END;

    LOCAL PROCEDURE GetAllEcomData@1000000064(VAR Request@1000000001 : BigText;XMLdocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument");
    VAR
      Header@1000000006 : Text[1000];
      XMLCurrNode@1000000005 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLdocOut@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      pNode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLFilterNode@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
    BEGIN
      XMLdocOut := XMLdocOut.XmlDocument;
      Header := '<?xml version="1.0" encoding="utf-8" ?><tables/>';
      XMLdocOut.LoadXml(Header);
      XMLCurrNode := XMLdocOut.DocumentElement;

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Languages');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Languages type="all" /></tables></GetEcomData>');
      Add_EcomLanguages(pNode, TRUE,XMLFilterNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Countries');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Countries type="all" /></tables></GetEcomData>');
      Add_EcomCountries(pNode, TRUE,XMLFilterNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Currencies');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Currencies type="all" /></tables></GetEcomData>');
      Add_EcomCurrencies(pNode, TRUE,XMLFilterNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Users');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Users type="all" importSalesPeople="true" /></tables></GetEcomData>');
      //Users /GetEcomData/tables/Users/@type') = 'all' /GetEcomData/tables/Contacts/@type') = 'all' //'/GetEcomData/tables/Customers/@type') = 'all'
      Add_AccessUser(pNode, TRUE, XMLFilterNode, TRUE,FALSE);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Addresses');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Addresses type="all" /></tables></GetEcomData>');
      Add_AccessUserAddress(pNode, TRUE, XMLFilterNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Manufacturers');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Manufacturers type="all" /></tables></GetEcomData>');
      Add_EcomManufacturers(pNode, TRUE,XMLFilterNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Units');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Units type="all" /></tables></GetEcomData>');
      Add_Units(pNode);

      //Products
      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'ProductGroups');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><ProductGroups type="all" /></tables></GetEcomData>');
      Add_EcomGroups(XMLdocIn, pNode);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'Products');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><Products type="all" importProductProperties="true" /></tables></GetEcomData>');
      Add_EcomProducts(XMLdocIn, pNode, TRUE);

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'ProductStockAndUnitsAndLocations');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><ProductStock type="all" importStockLocations="true" /></tables></GetEcomData>');

      Add_Locations(pNode);
      Add_StockUnits(pNode);
      Add_ProductsStock(pNode);
      // //End products

      Add_Element(XMLCurrNode, 'response', '', '', pNode,'');
      Add_Attribute(pNode, 'name', 'ProductPrices');
      Add_Attribute(pNode, 'query', '<GetEcomData setLanguage="LANG1"><tables><ProductPrices type="all" salesType="All customers" salesCode="" setLanguage="LANG1" setCurrency="" setUnitOfMeasure="" /></tables></GetEcomData>');
      GetProductPrices(pNode, 'All customers', '', Get_TextFromNode(XMLdocIn, '/GetAllEcomData/@setLanguage'),'', '');

      ConvertXmlToBigText(XMLdocOut,Request);
    END;

    LOCAL PROCEDURE Add_CustomerAccessUserAddress@1000000072(XMLCurrNode@1002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Addresses@1004 : Record 222;
      Customer@1000000003 : Record 18;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','AccessUserAddress');

      IF Customer.FINDSET(FALSE, FALSE) THEN BEGIN
        REPEAT
          Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
          Add_Attribute(XMLNewChild,'table','AccessUserAddress');
          Add_Field(XMLNewChild, 'AccessUserAddressUserID', FORMAT(Customer."No."));
          Add_Field(XMLNewChild, 'AccessUserAddressType', '1');
          Add_Field(XMLNewChild, 'AccessUserAddressCallName', 'Customer Address');
          Add_Field(XMLNewChild, 'AccessUserAddressCompany', Customer.Name);
          Add_Field(XMLNewChild, 'AccessUserAddressName', 'Customer Address');
          Add_Field(XMLNewChild, 'AccessUserAddressAddress', Customer.Address);
          Add_Field(XMLNewChild, 'AccessUserAddressAddress2', Customer."Address 2");
          Add_Field(XMLNewChild, 'AccessUserAddressZip', Customer."Post Code");
          Add_Field(XMLNewChild, 'AccessUserAddressCity', Customer.City);
          Add_Field(XMLNewChild, 'AccessUserAddressCountry', Customer."Country/Region Code");
          Add_Field(XMLNewChild, 'AccessUserAddressCell', Customer."Phone No.");
          Add_Field(XMLNewChild, 'AccessUserAddressFax', Customer."Fax No.");
          Add_Field(XMLNewChild, 'AccessUserAddressEmail', Customer."E-Mail");
          Add_Field(XMLNewChild, 'AccessUserAddressCustomerNumber', Customer."No.");
          Add_Field(XMLNewChild, 'AccessUserAddressUID', Customer."No." + '_CustomerAddress');
          Add_Field(XMLNewChild, 'AccessUserAddressState', Customer."Country/Region Code");
          Add_Field(XMLNewChild, 'AccessUserAddressPhoneBusiness', Customer."Phone No.");
          Add_Field(XMLNewChild, 'AccessUserAddressCountryCode', Customer."Country/Region Code");
          Add_Field(XMLNewChild, 'AccessUserAddressDefaultAddressCustomFields', 'False');
          XMLNewChild := XMLNewChild.ParentNode;
        UNTIL Customer.NEXT=0;
      END;

      //Ship-to Addresses
      IF (Addresses.FINDSET(FALSE, FALSE)) THEN BEGIN
        REPEAT
          IF Customer.GET(Addresses."Customer No.") THEN BEGIN
            Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
            Add_Attribute(XMLNewChild,'table','AccessUserAddress');

            Add_Field(XMLNewChild,'AccessUserAddressUserID', FORMAT(Customer."No."));
            Add_Field(XMLNewChild,'AccessUserAddressCompany', Customer.Name);
            Add_Field(XMLNewChild,'AccessUserAddressCustomerNumber', Customer."No.");
            Add_Field(XMLNewChild,'AccessUserAddressUID', Customer."No." + '_' + Addresses.Code);
            FillAddress(XMLNewChild, Addresses);
            XMLNewChild := XMLNewChild.ParentNode;
          END;
        UNTIL Addresses.NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE Add_CustomersImpersonation@1000000073(XMLCurrNode@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    VAR
      XMLNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      Customer@1000000002 : Record 18;
      SalesPerson@1000000005 : Record 13;
    BEGIN
      Add_Element(XMLCurrNode,'table','','',XMLNewChild,'');
      Add_Attribute(XMLNewChild,'tableName','AccessUserSecondaryRelation');

      IF (SalesPerson.FINDSET(FALSE, FALSE)) THEN BEGIN
        REPEAT
          Customer.SETRANGE("Salesperson Code", SalesPerson.Code);
          IF Customer.FINDSET(FALSE, FALSE) THEN BEGIN
            REPEAT
              Add_Element(XMLNewChild,'item','','',XMLNewChild,'');
              Add_Attribute(XMLNewChild,'table','AccessUserSecondaryRelation');
              Add_Field(XMLNewChild,'AccessUserSecondaryRelationUserId',SalesPerson.Code);
              Add_Field(XMLNewChild,'AccessUserSecondaryRelationSecondaryUserId',Customer."No.");
              XMLNewChild := XMLNewChild.ParentNode;
            UNTIL Customer.NEXT = 0;
          END;
        UNTIL SalesPerson.NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE FillAddress@1000000074(VAR XMLCurrNode@1002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Address@1000000000 : Record 222);
    BEGIN
      Add_Field(XMLCurrNode, 'AccessUserAddressType', '1');
      Add_Field(XMLCurrNode, 'AccessUserAddressCallName', Address.Name);
      Add_Field(XMLCurrNode, 'AccessUserAddressName', Address.Name);
      Add_Field(XMLCurrNode, 'AccessUserAddressAddress', Address.Address);
      Add_Field(XMLCurrNode, 'AccessUserAddressAddress2', Address."Address 2");
      Add_Field(XMLCurrNode, 'AccessUserAddressZip', Address."Post Code");
      Add_Field(XMLCurrNode, 'AccessUserAddressCity', Address.City);
      Add_Field(XMLCurrNode, 'AccessUserAddressCountry', Address."Country/Region Code");
      //Add_Field(XMLCurrNode, 'AccessUserAddressCell', Address."Phone No.");
      Add_Field(XMLCurrNode, 'AccessUserAddressFax', Address."Fax No.");
      Add_Field(XMLCurrNode, 'AccessUserAddressEmail', Address."E-Mail");
      Add_Field(XMLCurrNode, 'AccessUserAddressState', Address."Country/Region Code");
      //Add_Field(XMLCurrNode, 'AccessUserAddressPhoneBusiness', Address."Phone No.");
      Add_Field(XMLCurrNode, 'AccessUserAddressCountryCode', Address."Country/Region Code");
      Add_Field(XMLCurrNode, 'AccessUserAddressDefaultAddressCustomFields', 'False');
    END;

    LOCAL PROCEDURE CreateUpdateCustomerContact@1000000068(VAR customer@1000000000 : Record 18;VAR contact@1000000003 : Record 5050);
    VAR
      contactBusiness@1000000002 : Record 5054;
      CustContUpdate@1000000001 : Codeunit 5056;
      RMSetup@1000000004 : Record 5079;
    BEGIN
      contactBusiness.SETFILTER("No.", customer."No.");
      contactBusiness.SETFILTER("Business Relation Code", RMSetup."Bus. Rel. Code for Customers");
      contactBusiness.SETRANGE("Link to Table", contactBusiness."Link to Table"::Customer);
      IF NOT contactBusiness.FINDSET(FALSE, FALSE) THEN BEGIN
          contact.INIT;
          contact."No." := '';
          FillCompanyContactFromCustomer(contact, customer);
          contact.INSERT(TRUE);

          contactBusiness.INIT();
          contactBusiness."No." := customer."No.";
          contactBusiness."Business Relation Code" := RMSetup."Bus. Rel. Code for Customers";
          contactBusiness."Link to Table" :=  contactBusiness."Link to Table"::Customer;
          contactBusiness."Contact No." := contact."No.";
          contactBusiness."Business Relation Description" := 'Customer';
          contactBusiness."Contact Name" := customer.Name;
          contactBusiness.INSERT();
      END ELSE BEGIN
          IF contactBusiness."Contact Name" <> customer.Name THEN BEGIN
              contactBusiness."Contact Name" := customer.Name;
              contactBusiness.MODIFY();
          END;
          IF contact.GET(contactBusiness."Contact No.") THEN BEGIN
              FillCompanyContactFromCustomer(contact, customer);
              contact.MODIFY();
          END ELSE BEGIN
              contact.INIT;
              contact."No." := '';
              FillCompanyContactFromCustomer(contact, customer);
              contact.INSERT(TRUE);

              contactBusiness."Contact No." := contact."No.";
              contactBusiness."Contact Name" := customer.Name;
              contactBusiness.MODIFY();
          END;
      END;
    END;

    LOCAL PROCEDURE FillCompanyContactFromCustomer@1000000075(VAR contact@1000000000 : Record 5050;VAR customer@1000000001 : Record 18);
    BEGIN
      contact.Type := contact.Type::Company;
      contact."Company Name" := customer.Name;
      contact."Company No." := contact."No.";
      contact.Name := customer.Name;
      contact."E-Mail" := customer."E-Mail";
      contact."Phone No." := customer."Phone No.";
      contact."Fax No." := customer."Fax No.";
      contact.Address := customer.Address;
      contact."Address 2" := customer."Address 2";
      contact."Post Code" := customer."Post Code";
      contact.City := customer.City;
      contact."E-Mail" := customer."E-Mail";
      contact."Country/Region Code" := customer."Country/Region Code";
      //contact."Mobile Phone No." := customer."Mobile Phone No."; -- no such field in the Customer
      contact."Currency Code" := customer."Currency Code";
    END;

    LOCAL PROCEDURE GetTextFromNode@1000000082(VAR pXmlNode@1000000000 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";xpath@1000000001 : Text;maxLength@1000000002 : Integer) : Text;
    VAR
      text@1000000003 : Text;
      l@1000000004 : Integer;
    BEGIN
      text := Get_TextFromNode(pXmlNode, xpath);
      l := STRLEN(text);
      IF l > maxLength THEN
          EXIT(COPYSTR(text, 1, maxLength))
      ELSE
          EXIT(text);
    END;

    LOCAL PROCEDURE UpdateContact@1000000085(name@1000000002 : Text[100];XMLNode@1000000001 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR contact@1000000000 : Record 5050);
    VAR
      countryCode@1000000003 : Text;
    BEGIN
      contact."Job Title" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserJobTitle'']',
          MAXSTRLEN(contact."Job Title"));
      contact."Mobile Phone No." := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserMobile'']',
          MAXSTRLEN(contact."Mobile Phone No."));
      contact."Middle Name" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserMiddleName'']',
          MAXSTRLEN(contact."Middle Name"));
      contact.Surname := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserLastName'']',
          MAXSTRLEN(contact.Surname));
      contact.Initials := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserInitials'']',
          MAXSTRLEN(contact.Initials));

      contact.Name := name;
      contact."E-Mail" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserEmail'']',
          MAXSTRLEN(contact."E-Mail"));
      contact."Phone No." := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserPhone'']',
          MAXSTRLEN(contact."Phone No."));
      contact."Fax No." := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserFax'']',
          MAXSTRLEN(contact."Fax No."));
      contact.Address := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserAddress'']',
          MAXSTRLEN(contact.Address));
      contact."Address 2" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserAddress2'']',
          MAXSTRLEN(contact."Address 2"));
      contact."Post Code" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserZip'']',
          MAXSTRLEN(contact."Post Code"));
      contact.City := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCity'']',
          MAXSTRLEN(contact.City));
      contact."Currency Code" := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserCurrencyCharacter'']');
      countryCode := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCountryCode'']',
          MAXSTRLEN(contact."Country/Region Code"));
      IF (countryCode <> '') THEN
          contact."Country/Region Code" := countryCode
      ELSE
          contact."Country/Region Code" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCountry'']',
              MAXSTRLEN(contact."Country/Region Code"));
    END;

    LOCAL PROCEDURE InsertCustomerAndReturnId@1000000086(accessUserId@1000000000 : Text;VAR XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR customer@1000000002 : Record 18);
    VAR
      XMLNewChild@1000000003 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      pXmlNode@1000000004 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      InsertCustomer(customer);
      Add_Element(XMLCurrNode, 'user', '', '', XMLNewChild, '');
      Add_Element(XMLNewChild, 'userId', accessUserId, '', pXmlNode, '');
      Add_Element(XMLNewChild, 'externalUserId', customer."No.", '', pXmlNode, '');
      Add_Element(XMLNewChild, 'externalCustomerNumber', customer."No.", '', pXmlNode, '');
    END;

    LOCAL PROCEDURE InsertCustomer@1000000087(VAR customer@1000000000 : Record 18);
    BEGIN
      customer.INIT;
      customer.INSERT(TRUE);
    END;

    LOCAL PROCEDURE InsertContact@1000000089(accessUserId@1000000002 : Text;VAR XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";customerCompanyContact@1000000000 : Record 5050;customer@1000000003 : Record 18;VAR contact@1000000004 : Record 5050);
    VAR
      XMLNewChild@1000000005 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      pXmlNode@1000000006 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      contact.INIT;
      contact.Type := contact.Type::Person;
      UpdateContactCustomer(contact, customerCompanyContact);
      contact.INSERT(TRUE);
      Add_Element(XMLCurrNode, 'user', '', '', XMLNewChild, '');
      Add_Element(XMLNewChild, 'userId', accessUserId, '', pXmlNode, '');
      Add_Element(XMLNewChild, 'externalUserId', contact."No.", '', pXmlNode, '');
      Add_Element(XMLNewChild, 'externalCustomerNumber', customer."No.", '', pXmlNode, '');
    END;

    LOCAL PROCEDURE UpdateContactCustomer@1000000090(VAR contact@1000000000 : Record 5050;customerCompanyContact@1000000001 : Record 5050);
    BEGIN
      contact."Company Name" := customerCompanyContact.Name;
      contact."Company No." := customerCompanyContact."No.";
    END;

    LOCAL PROCEDURE UpdateCustomer@1000000096(GenBusPostingGroup@1000000000 : Text;VATBusPostingGroup@1000000001 : Text;CustomerPostingGroup@1000000002 : Text;name@1000000003 : Text[100];XMLNode@1000000005 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";VAR customer@1000000004 : Record 18);
    VAR
      countryCode@1000000006 : Text;
    BEGIN
      customer.Name := name;
      customer."E-Mail" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserEmail'']',
          MAXSTRLEN(customer."E-Mail"));
      customer."Phone No." := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserPhone'']',
          MAXSTRLEN(customer."Phone No."));
      customer."Fax No." := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserFax'']',
          MAXSTRLEN(customer."Fax No."));
      customer.Address := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserAddress'']',
          MAXSTRLEN(customer.Address));
      customer."Address 2" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserAddress2'']',
          MAXSTRLEN(customer."Address 2"));
      customer."Post Code" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserZip'']',
          MAXSTRLEN(customer."Post Code"));
      customer.City := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCity'']',
          MAXSTRLEN(customer.City));
      countryCode := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCountryCode'']',
          MAXSTRLEN(customer."Country/Region Code"));
      IF (countryCode <> '') THEN
          customer."Country/Region Code" := countryCode
      ELSE
          customer."Country/Region Code" := GetTextFromNode(XMLNode, 'column[@columnName=''AccessUserCountry'']',
              MAXSTRLEN(customer."Country/Region Code"));
      customer."Currency Code" := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserCurrencyCharacter'']');
      customer."Gen. Bus. Posting Group" := GenBusPostingGroup;
      customer."VAT Bus. Posting Group" := VATBusPostingGroup;
      customer."Customer Posting Group" := CustomerPostingGroup;
      customer.MODIFY();
    END;

    LOCAL PROCEDURE GetCustomerCompanyContact@1000000097(VAR customer@1000000000 : Record 18;VAR customerCompanyContact@1000000001 : Record 5050);
    VAR
      contactBusiness@1000000002 : Record 5054;
      RMSetup@1000000003 : Record 5079;
    BEGIN
      contactBusiness.SETFILTER("No.", customer."No.");
      contactBusiness.SETFILTER("Business Relation Code", RMSetup."Bus. Rel. Code for Customers");
      contactBusiness.SETRANGE("Link to Table", contactBusiness."Link to Table"::Customer);
      IF contactBusiness.FINDSET(FALSE, FALSE) THEN BEGIN
          customerCompanyContact.GET(contactBusiness."Contact No.");
      END;
    END;

    LOCAL PROCEDURE PutUserAddresses@1000000101(XMLDocIn@1000000000 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";VAR XMLCurrNode@1000000001 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";dwCustomerNumberCustomerNo@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2");
    VAR
      customer@1000000003 : Record 18;
      shipToAddress@1000000004 : Record 222;
      contactAltAddress@1000000005 : Record 5051;
      contact@1000000006 : Record 5050;
      XMLNodeList@1000000007 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000008 : Integer;
      XMLNode@1000000009 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      XMLNewChild@1000000010 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      pXmlNode@1000000011 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      userNode@1000000012 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      customerNumber@1000000013 : Text;
      accessUserAddressId@1000000014 : Text;
      accessUserId@1000000015 : Text;
      addressKeyAddressUId@1000000016 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2";
      contactId@1000000017 : Text;
      addressKey@1000000018 : Text;
      userNodeFound@1000000019 : Boolean;
      addressDictionary@1000000020 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2";
      addressUId@1000000021 : Text;
      Type@1000000025 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Type";
      Activator@1000000024 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Activator";
      Arr@1000000023 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      String@1000000022 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.String";
    BEGIN
      Arr := Arr.CreateInstance(GETDOTNETTYPE(Type),2);
      Arr.SetValue(GETDOTNETTYPE(String),0);
      Arr.SetValue(GETDOTNETTYPE(String),1);
      Type := GETDOTNETTYPE(addressDictionary);
      Type := Type.MakeGenericType(Arr);
      addressDictionary := Activator.CreateInstance(Type);
      Type := GETDOTNETTYPE(addressKeyAddressUId);
      Type := Type.MakeGenericType(Arr);
      addressKeyAddressUId := Activator.CreateInstance(Type);
      //If DW users with the same customer numbers has the same address,
      //then this address becomes a ship-to address on the customer record in NAV/BC.
      XMLNodeList := XMLDocIn.SelectNodes('/PutEcomUsers/table[@tableName=''AccessUserAddress'']/item[column[@columnName=''AccessUserAddressUID''] = '''']');
      IF XMLNodeList.Count() = 0 THEN
          XMLNodeList := XMLDocIn.SelectNodes('/PutEcomUsers/table[@tableName=''AccessUserAddress'']/item[column[@columnName=''AccessUserAddressUId''] = '''']');
      FOR i := 0 TO XMLNodeList.Count() - 1 DO BEGIN
          XMLNode := XMLNodeList.ItemOf(i);
          CLEAR(contact);
          CLEAR(customer);
          CLEAR(shipToAddress);
          CLEAR(contactAltAddress);
          addressDictionary.Clear();
          userNodeFound := FALSE;

          accessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressId'']');
          IF accessUserAddressId = '' THEN
              accessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressID'']');
          customerNumber := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCustomerNumber'']');
          accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressUserID'']');
          IF accessUserId = '' THEN
              accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressUserId'']');

          IF (accessUserId <> '') AND (customerNumber = '') THEN BEGIN
            userNode := XMLDocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserID''] = ''' +
                          accessUserId + ''']');
            IF NOT ISNULL(userNode) THEN userNodeFound :=  TRUE;

            IF NOT userNodeFound THEN BEGIN
                userNode := XMLDocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserId''] = ''' +
                    accessUserId + ''']');
                IF NOT ISNULL(userNode) THEN userNodeFound :=  TRUE;
            END;
            IF userNodeFound THEN BEGIN
                customerNumber := Get_TextFromNode(userNode, 'column[@columnName=''AccessUserCustomerNumber'']');
            END;
          END;

          IF (accessUserAddressId <> '') AND (accessUserId <> '') AND (customerNumber <> '') THEN BEGIN
              UpdateAddressDictionary(addressDictionary, XMLNode);
              addressKey := GetAddressKey(customerNumber, addressDictionary);
              IF (NOT addressKeyAddressUId.ContainsKey(addressKey)) THEN BEGIN
                  IF HasTheSameAddress(accessUserAddressId, customerNumber, addressDictionary, XMLDocIn) THEN BEGIN
                      //then this address becomes a ship-to address on the customer record in NAV/BC.
                      IF customer.GET(customerNumber) THEN BEGIN
                          shipToAddress.INIT();
                          shipToAddress."Customer No." := customer."No.";
                          shipToAddress.Code := GetText(accessUserAddressId, 10);
                          UpdateShipToAddress(shipToAddress, addressDictionary);
                          IF IsExistingAddress(shipToAddress) THEN
                              shipToAddress.MODIFY()
                          ELSE
                              shipToAddress.INSERT();
                          //return address id
                          Add_Element(XMLCurrNode, 'userAddress', '', '', XMLNewChild, '');
                          Add_Element(XMLNewChild, 'AccessUserAddressId', accessUserAddressId, '', pXmlNode, '');
                          addressUId := customer."No." + '_' + shipToAddress.Code;
                          Add_Element(XMLNewChild, 'AccessUserAddressUId', addressUId, '', pXmlNode, '');
                          addressKeyAddressUId.Add(addressKey, addressUId);
                      END ELSE BEGIN
                          addressKeyAddressUId.Add(addressKey, '');
                      END;
                  END ELSE BEGIN
                      //alt address of contact
                      IF NOT userNodeFound THEN BEGIN
                          userNode := XMLDocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserID''] = ''' +
                          accessUserId + ''']');
                          IF NOT ISNULL(userNode) THEN userNodeFound := TRUE;
                      END;
                      IF NOT userNodeFound THEN BEGIN
                          userNode := XMLDocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserId''] = ''' +
                          accessUserId + ''']');
                          IF NOT ISNULL(userNode) THEN userNodeFound := TRUE;
                      END;
                      IF userNodeFound THEN BEGIN
                          contactId := Get_TextFromNode(userNode, 'column[@columnName=''AccessUserExternalID'']');
                          IF contactId = '' THEN
                              contactId := Get_TextFromNode(userNode, 'column[@columnName=''AccessUserExternalId'']');
                          IF contact.GET(contactId) THEN BEGIN
                              contactAltAddress.INIT();
                              contactAltAddress."Contact No." := contact."No.";
                              contactAltAddress.Code := GetText(accessUserAddressId, 10);
                              UpdateAltAddress(contactAltAddress, addressDictionary);
                              IF IsExistingAltAddress(contactAltAddress) THEN
                                  contactAltAddress.MODIFY()
                              ELSE
                                  contactAltAddress.INSERT();
                              //return address id
                              Add_Element(XMLCurrNode, 'userAddress', '', '', XMLNewChild, '');
                              Add_Element(XMLNewChild, 'AccessUserAddressId', accessUserAddressId, '', pXmlNode, '');
                              Add_Element(XMLNewChild, 'AccessUserAddressUId', contactAltAddress."Contact No." + '_' + contactAltAddress.Code, '', pXmlNode, '');
                          END;
                      END;
                  END;
              END ELSE BEGIN
                  IF addressKeyAddressUId.TryGetValue(addressKey, addressUId) THEN
                  IF addressUId <> '' THEN BEGIN
                      //return address id
                      Add_Element(XMLCurrNode, 'userAddress', '', '', XMLNewChild, '');
                      Add_Element(XMLNewChild, 'AccessUserAddressId', accessUserAddressId, '', pXmlNode, '');
                      Add_Element(XMLNewChild, 'AccessUserAddressUId', addressUId, '', pXmlNode, '');
                  END;
              END;
          END;
      END;
    END;

    LOCAL PROCEDURE IsExistingAddress@1000000102(shipToAddress@1000000000 : Record 222) : Boolean;
    VAR
      address@1000000001 : Record 222;
    BEGIN
      address.SETFILTER(Code, shipToAddress.Code);
      address.SETFILTER("Customer No.", shipToAddress."Customer No.");
      EXIT(address.FINDSET(FALSE, FALSE))
    END;

    LOCAL PROCEDURE IsExistingAltAddress@1000000103(contactAltAddress@1000000000 : Record 5051) : Boolean;
    VAR
      address@1000000001 : Record 5051;
    BEGIN
      address.SETFILTER(Code, contactAltAddress.Code);
      address.SETFILTER("Contact No.", contactAltAddress."Contact No.");
      EXIT(address.FINDSET(FALSE, FALSE))
    END;

    LOCAL PROCEDURE GetAddressKey@1000000104(customerNo@1000000000 : Text;addressDictionary@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2") : Text;
    VAR
      ret@1000000002 : Text;
      t@1000000003 : Text;
    BEGIN
      ret := customerNo;
      FOREACH t IN addressDictionary.Values DO BEGIN
          ret += t;
      END;
      EXIT(ret);
    END;

    LOCAL PROCEDURE HasTheSameAddress@1000000105(accessUserAddressId@1000000000 : Text;customerNumber@1000000001 : Text;addressDictionary@1000000002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2";XMLdocIn@1000000003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument") : Boolean;
    VAR
      XMLNodeList@1000000004 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNodeList";
      i@1000000005 : Integer;
      currAccessUserAddressId@1000000006 : Text;
      XMLNode@1000000007 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      otherAddressFound@1000000008 : Boolean;
      accessUserId@1000000009 : Text;
      userNode@1000000010 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      userCustomerNumber@1000000011 : Text;
    BEGIN
      //check all accessUser
      XMLNodeList := XMLdocIn.SelectNodes('/PutEcomUsers/table[@tableName=''AccessUserAddress'']/item[column[@columnName=''AccessUserAddressCustomerNumber''] = ''' + customerNumber + ''']');
      FOR i := 0 TO XMLNodeList.Count() - 1 DO BEGIN
          XMLNode := XMLNodeList.ItemOf(i);
          currAccessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressId'']');
          IF currAccessUserAddressId = '' THEN
              currAccessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressID'']');

          IF (currAccessUserAddressId <> accessUserAddressId) THEN BEGIN
              otherAddressFound := TRUE;
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressEmail'']') <> FORMAT(addressDictionary.Item('AccessUserAddressEmail')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressPhone'']') <> FORMAT(addressDictionary.Item('AccessUserAddressPhone')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressFax'']') <> FORMAT(addressDictionary.Item('AccessUserAddressFax')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress'']') <> FORMAT(addressDictionary.Item('AccessUserAddressAddress')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress2'']') <> FORMAT(addressDictionary.Item('AccessUserAddressAddress2')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressZip'']') <> FORMAT(addressDictionary.Item('AccessUserAddressZip')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCity'']') <> FORMAT(addressDictionary.Item('AccessUserAddressCity')) THEN EXIT(FALSE);
              IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCountryCode'']') <> FORMAT(addressDictionary.Item('AccessUserAddressCountryCode')) THEN EXIT(FALSE);
          END;
      END;
      //check addresses with empty customer numbers
      XMLNodeList := XMLdocIn.SelectNodes('/PutEcomUsers/table[@tableName=''AccessUserAddress'']/item[column[@columnName=''AccessUserAddressCustomerNumber''] = '''']');
      FOR i := 0 TO XMLNodeList.Count() - 1 DO BEGIN
          XMLNode := XMLNodeList.ItemOf(i);
          currAccessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressID'']');
          IF currAccessUserAddressId = '' THEN
              currAccessUserAddressId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressId'']');

          IF (currAccessUserAddressId <> accessUserAddressId) THEN BEGIN
              accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressUserID'']');
              IF accessUserId = '' THEN
                  accessUserId := Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressUserId'']');
              IF accessUserId <> '' THEN BEGIN
                  userNode := XMLdocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserID''] = ''' +
                                              accessUserId + ''']');
                  IF ISNULL(userNode) THEN
                    userNode := XMLdocIn.SelectSingleNode('/PutEcomUsers/table[@tableName=''AccessUser'']/item[column[@columnName=''AccessUserId''] = ''' +
                      accessUserId + ''']');
                  IF NOT ISNULL(userNode) THEN BEGIN
                      userCustomerNumber := Get_TextFromNode(userNode, 'column[@columnName=''AccessUserCustomerNumber'']');
                      IF userCustomerNumber = customerNumber THEN BEGIN
                          otherAddressFound := TRUE;
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressEmail'']') <> FORMAT(addressDictionary.Item('AccessUserAddressEmail')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressPhone'']') <> FORMAT(addressDictionary.Item('AccessUserAddressPhone')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressFax'']') <> FORMAT(addressDictionary.Item('AccessUserAddressFax')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress'']') <> FORMAT(addressDictionary.Item('AccessUserAddressAddress')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress2'']') <> FORMAT(addressDictionary.Item('AccessUserAddressAddress2')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressZip'']') <> FORMAT(addressDictionary.Item('AccessUserAddressZip')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCity'']') <> FORMAT(addressDictionary.Item('AccessUserAddressCity')) THEN EXIT(FALSE);
                          IF Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCountryCode'']') <> FORMAT(addressDictionary.Item('AccessUserAddressCountryCode')) THEN EXIT(FALSE);
                      END;
                  END;
              END;
          END;
      END;
      IF (otherAddressFound) THEN EXIT(TRUE);
      EXIT(FALSE);
    END;

    LOCAL PROCEDURE UpdateShipToAddress@1000000106(VAR shipToAddress@1000000000 : Record 222;addressDictionary@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2");
    BEGIN
      shipToAddress.Name := GetText(FORMAT(addressDictionary.Item('AccessUserAddressCallName')), MAXSTRLEN(shipToAddress.Name));
      shipToAddress."E-Mail" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressEmail')), MAXSTRLEN(shipToAddress."E-Mail"));
      shipToAddress."Phone No." := GetText(FORMAT(addressDictionary.Item('AccessUserAddressPhone')), MAXSTRLEN(shipToAddress."Phone No."));
      shipToAddress."Fax No." := GetText(FORMAT(addressDictionary.Item('AccessUserAddressFax')), MAXSTRLEN(shipToAddress."Fax No."));
      shipToAddress.Address := GetText(FORMAT(addressDictionary.Item('AccessUserAddressAddress')), MAXSTRLEN(shipToAddress.Address));
      shipToAddress."Address 2" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressAddress2')), MAXSTRLEN(shipToAddress."Address 2"));
      shipToAddress."Country/Region Code" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressCountryCode')), MAXSTRLEN(shipToAddress."Country/Region Code"));
      shipToAddress."Post Code" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressZip')), MAXSTRLEN(shipToAddress."Post Code"));
      shipToAddress.City := GetText(FORMAT(addressDictionary.Item('AccessUserAddressCity')), MAXSTRLEN(shipToAddress.City));
    END;

    LOCAL PROCEDURE UpdateAltAddress@1000000107(VAR contactAltAddress@1000000000 : Record 5051;addressDictionary@1000000001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2");
    BEGIN
      contactAltAddress."E-Mail" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressEmail')), MAXSTRLEN(contactAltAddress."E-Mail"));
      contactAltAddress."Phone No." := GetText(FORMAT(addressDictionary.Item('AccessUserAddressPhone')), MAXSTRLEN(contactAltAddress."Phone No."));
      contactAltAddress."Fax No." := GetText(FORMAT(addressDictionary.Item('AccessUserAddressFax')), MAXSTRLEN(contactAltAddress."Fax No."));
      contactAltAddress.Address := GetText(FORMAT(addressDictionary.Item('AccessUserAddressAddress')), MAXSTRLEN(contactAltAddress.Address));
      contactAltAddress."Address 2" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressAddress2')), MAXSTRLEN(contactAltAddress."Address 2"));
      contactAltAddress."Country/Region Code" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressCountryCode')), MAXSTRLEN(contactAltAddress."Country/Region Code"));
      contactAltAddress."Post Code" := GetText(FORMAT(addressDictionary.Item('AccessUserAddressZip')), MAXSTRLEN(contactAltAddress."Post Code"));
      contactAltAddress.City := GetText(FORMAT(addressDictionary.Item('AccessUserAddressCity')), MAXSTRLEN(contactAltAddress.City));
    END;

    LOCAL PROCEDURE GetText@1000000109(text@1000000000 : Text;maxLength@1000000001 : Integer) : Text;
    VAR
      l@1000000002 : Integer;
    BEGIN
      l := STRLEN(text);
      IF l > maxLength THEN
          EXIT(COPYSTR(text, 1, maxLength))
      ELSE
          EXIT(text);
    END;

    LOCAL PROCEDURE UpdateAddressDictionary@1000000115(VAR addressDictionary@1000000000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Generic.Dictionary`2";XMLNode@1000000001 : DotNet "'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode");
    BEGIN
      addressDictionary.Add('AccessUserAddressCallName', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCallName'']'));
      addressDictionary.Add('AccessUserAddressEmail', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressEmail'']'));
      addressDictionary.Add('AccessUserAddressPhone', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressPhone'']'));
      addressDictionary.Add('AccessUserAddressFax', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressFax'']'));
      addressDictionary.Add('AccessUserAddressAddress', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress'']'));
      addressDictionary.Add('AccessUserAddressAddress2', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressAddress2'']'));
      addressDictionary.Add('AccessUserAddressZip', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressZip'']'));
      addressDictionary.Add('AccessUserAddressCity', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCity'']'));
      addressDictionary.Add('AccessUserAddressCountryCode', Get_TextFromNode(XMLNode, 'column[@columnName=''AccessUserAddressCountryCode'']'));
    END;

    LOCAL PROCEDURE Add_FieldBigText@1000000076(VAR XMLNode@1000000002 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";Field@1000000003 : Text;Value@1000000000 : BigText);
    VAR
      XmlNewChild@1000000001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      Add_Element(XMLNode,'column','','',XmlNewChild,'');
      Add_Attribute(XmlNewChild,'columnName',Field);
      Add_CdataElementBigText(XmlNewChild,Value);
      XmlNewChild := XmlNewChild.ParentNode;
    END;

    LOCAL PROCEDURE Add_CdataElementBigText@1000000077(VAR XMLNode@1001 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";NodeText@1060003 : BigText);
    VAR
      NewChildNode@1060008 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
    BEGIN
      NewChildNode := XMLNode.OwnerDocument.CreateCDataSection(NodeText);
      XMLNode.AppendChild(NewChildNode);
    END;

    LOCAL PROCEDURE CalculateInvoiceDiscountForLines@1000000078(VAR SalesHeader@1001 : Record 36;VAR orderLines@1002 : ARRAY [10000] OF Variant;orderLinesCounter@1003 : Integer;VAR invoiceDiscountAmountWithVat@1000000000 : Decimal;VAR anyLineHasDifferentVatPercent@1000000002 : Boolean);
    VAR
      salesline@1004 : Record 37;
      i@1005 : Integer;
      linePriceWithWAT@1006 : Decimal;
      linePriceWithoutWAT@1007 : Decimal;
      invoiceDiscountLinesPriceWithoutVat@1008 : Decimal;
      invoiceDiscountPercent@1009 : Decimal;
      invoiceDiscountLinesPriceWithVat@1000000001 : Decimal;
      localVatPercent@1000000003 : Decimal;
    BEGIN
        localVatPercent := -1;
        FOR i := 1 TO orderLinesCounter - 1 DO BEGIN
            salesline := orderLines[i];
            IF salesline."Allow Invoice Disc." THEN BEGIN
                IF localVatPercent = -1 THEN
                    localVatPercent := salesline."VAT %";

                IF salesline."VAT %" <> localVatPercent THEN
                    anyLineHasDifferentVatPercent := TRUE;

                IF (SalesHeader."Prices Including VAT" = TRUE) THEN BEGIN
                    linePriceWithWAT := ROUND(salesline."Unit Price" * salesline.Quantity, 0.01, '=');
                    linePriceWithWAT := linePriceWithWAT - salesline."Line Discount Amount";
                    linePriceWithoutWAT := ROUND((linePriceWithWAT / (1 + (salesline."VAT %" / 100))), 0.01, '=');
                END ELSE BEGIN
                    linePriceWithoutWAT := ROUND(salesline."Unit Price" * salesline.Quantity, 0.01, '=');
                    linePriceWithoutWAT := linePriceWithoutWAT - salesline."Line Discount Amount";
                    linePriceWithWAT := ROUND((linePriceWithoutWAT * (1 + (salesline."VAT %" / 100))), 0.01, '=');
                END;
                invoiceDiscountLinesPriceWithoutVat := invoiceDiscountLinesPriceWithoutVat + linePriceWithoutWAT;
                invoiceDiscountLinesPriceWithVat := invoiceDiscountLinesPriceWithVat + linePriceWithWAT;
            END;
        END;

        invoiceDiscountPercent := GetInvoiceDiscountPercent(SalesHeader, invoiceDiscountLinesPriceWithoutVat);
        IF invoiceDiscountPercent > 0 THEN BEGIN
            SalesHeader."Invoice Discount Amount" := ROUND((invoiceDiscountLinesPriceWithoutVat * invoiceDiscountPercent / 100), 0.01, '=');
            invoiceDiscountAmountWithVat := ROUND((invoiceDiscountLinesPriceWithVat * invoiceDiscountPercent / 100), 0.01, '=');
        END;
    END;

    LOCAL PROCEDURE CalculatePriceWithVat@1000000079(PricesInclVAT@1000000000 : Boolean;VATPercent@1000000001 : Decimal;price@1000000002 : Decimal;VAR priceWithoutVAT@1000000003 : Decimal;VAR priceWithVAT@1000000004 : Decimal);
    BEGIN
      IF PricesInclVAT THEN BEGIN
          priceWithVAT := price;
          priceWithoutVAT := ROUND((price / (1 + (VATPercent / 100))), 0.001, '=');
      END ELSE BEGIN
          priceWithoutVAT := price;
          priceWithVAT := ROUND((price * (1 + (VATPercent / 100))), 0.001, '=');
      END;
    END;

    LOCAL PROCEDURE ReplaceInvalidXMLCharacters@1000000080(pText@1000000000 : Text) : Text;
    VAR
      lText@1000000001 : Text;
    BEGIN
        lText := pText;
        lText := ReplaceString(lText, '&', '&amp;');
        lText := ReplaceString(lText, '<', '&lt;');
        lText := ReplaceString(lText, '>', '&gt;');
        lText := ReplaceString(lText, '"', '&quot;');
        lText := ReplaceString(lText, '''', '&apos;');
        EXIT(lText);
    END;

    LOCAL PROCEDURE ReplaceString@1000000083(String@1001 : Text;FindWhat@1002 : Text;ReplaceWith@1003 : Text) : Text;
    VAR
      NewString@1004 : Text;
      FindPos@1005 : Integer;
    BEGIN
        FindPos := STRPOS(String,FindWhat);
        WHILE FindPos > 0 DO BEGIN
            NewString += DELSTR(String,FindPos) + ReplaceWith;
            String := COPYSTR(String,FindPos + STRLEN(FindWhat));
        FindPos := STRPOS(String,FindWhat);
        END;
        NewString += String;
        EXIT(NewString);
    END;

    local procedure GetItemUnitId@1000000084(item@1001 : Record Item;unitId@1002 : Text) : Code[10];
    var
        uom@1003 : Code[10];
        unitOfMeasure@1004 : Record "Unit of Measure";
        itemUOM@1005 : Record "Item Unit of Measure";
    begin
        uom := GetText(GetUOMCode(unitId), MaxStrLen(item."Base Unit of Measure"));
        if uom <> '' then begin
            if not unitOfMeasure.GET(uom) then begin
                uom := item."Base Unit of Measure";
            end else begin
              if itemUOM.Get(item."No.", unitOfMeasure.Code) then
                QtyPerUOM := itemUOM."Qty. per Unit of Measure";
            end;
        end else begin
            uom := item."Base Unit of Measure";
        end;        
        exit(uom);
    end;

    BEGIN
    END.
  }
}

