Mont Blanc Release of SuiteCommerce Advanced

Welcome to the Mont Blanc release of SuiteCommerce Advanced! This version includes the following enhancements:

The following bundles are available:

Important:

To take advantage of new features in existing implementations, you must migrate the new code to your existing code base. For details, see Migrate SuiteCommerce Advanced.

Click the following link to download a .zip file containing .patch files for the Mont Blanc release:

Mont_Blanc_2.0_Patch_Files.zip

These .patch files contain the complete diffs between this release and the Denali R2 release.

Use a tool such as Crucible to open these files and graphically visualize all additions, deletions, and modifications. You can also view .patch file in a text editor. They are displayed with appropriate syntax highlighting when the syntax is set to diff.

Change in Supported Version of Node.js

With this release of SuiteCommerce Advanced, the developer tools were modified to support Node.js version 4.2.6 in addition to support for version 0.12.x. See Install JavaScript Utilities for more information.

Quotes

With this release of SuiteCommerce Advanced, users can now create quotes from your website. With this feature enabled, a Request a Quote link appears by default to all users (logged in or not) in your site’s Shopping and My Account header. These links direct users to a page where they can search for and add items, enter shipping information, and add optional user comments to build a quote request.

Users can eventually make purchases from a quote, but only after the quote reaches a certain status in the corresponding Estimate record. You configure the status that triggers this functionality by editing code in the Configuration.js file. You can also configure the time (in days) that all quotes expire after initial submittal.

To enable this feature you must perform the following tasks:

Note:

The Quotes feature will function without the Reference Product List Records bundle installed. However, items built in a product list will be non-persistent and will be lost if the user leaves the site before submitting the quote. Installing the Reference Product List Records bundle ensures that product list items are persistent. Shipping information and user comments are non-persistent, regardless of bundle installation.

Optional customizations include:

For detailed information about enabling the Quotes feature, see Quotes for Commerce Websites.

Purchases From Quotes

After a user submits a quote request, any web site links to Review or Purchasing pages are disabled. This prevents users from making a purchase from that quote until the merchant allows it.

In NetSuite, the Estimate record’s Status field lists all available Customer Statuses for the quote. When the merchant manually changes this field to the Customer Status whose Internal ID matches the ID you set in the Configuration.js file, all web site links to Review or Purchasing pages are enabled. The user can then make a purchase.

The Customer Status List at Setup > Sales > Customer Statuses displays the Customer Statuses configured for your account and their associated Internal IDs. You declare this Internal ID using the purchase_ready_status_id property in the Configuration.js file.

All quotes use the same configurable expiration, in days. After this time expires, the quote can no longer become a purchase. You set this expiration using the days_to_expire property in the Configuration.js file.

In the following example, quotes created on your site expire 14 days after the initial RFQ. Assuming a quote has not expired, it becomes available for purchase when its associated Estimate record reaches the Qualified Customer Status (Internal ID = 7).

          ,   quote: {
      days_to_expire: 14
,   purchase_ready_status_id: '7'
      } 

        

You must also configure what transaction form is used to create the purchase. You set the Internal ID of the chosen transaction form using the invoice_form_id property in the Configuration.js file.

          ,   quote_to_salesorder_wizard: {
      invoice_form_id: '89'
   } 

        

Disable Create a Quote Functionality

After setting up your account for quotes, you can configure SuiteCommerce Advanced to disable a user’s ability to create a quote from your site. Users can view quotes and make purchases, but they can not create a quote directly using your site.

To do this, delete all lines within the distro.json file that contain either of the following references:

          RequestQuoteAccessPoints
RequestQuoteWizard 

        

See Disable Quotes for detailed information.

Customize Sales Representative Information

The Quotes feature displays Sales Representative information about your site’s Quote Details page. You can customize your web site to display the Sales Representative as configured in NetSuite. If your NetSuite account does not have Sales Representative information set up, or you do not want to display the information, you can add a customized message instead.

What displays on your site depends on the SalesRep field on the quote’s Estimate record in NetSuite.

See Customize Sales Representative Information for instructions.

More Information

Before setting up the Quotes feature on your SuiteCommerce Advanced web site, understand the following information:

Site Access Restriction

With this release of SuiteCommerce Advanced, you can now restrict access to your web site in one of two ways:

These features are disabled by default and require set up in NetSuite and some minor customization of the Configuration.js file to function.

Warning:

The Search API is public and contains all the information exposed by the fieldset being used. Enabling password protection restricts users from accessing some or all of your site. However, a user who knows a URL that calls the Search API could access some of this information.

Restrict Access to Your Entire Site

You can now restrict your entire site to only logged in users. If this feature is enabled, visitors must register and log in to see the contents of your site. The site redirects unauthenticated visitors to a Login page with a link to a Registration form where they must register on your site to gain access. After a logged in user does not interact with the site for 30 minutes, their session ends. The first action they perform that calls a service redirects them to a Login page.

To enable this feature, you must perform some minor NetSuite set up and set the passwordProtectedSite property to true in the Configuration.js file. For detailed information about restricting all access to your site, see Restrict Access to Your Entire Site

Restrict Access to Pricing Information

You can now restrict pricing information to only registered users. If enabled, visitors have access to your site but they must log in to view prices and purchase products or services. This feature lets you hide prices from competitors or wholesalers and encourages users to register on your site.

With this feature enabled and a user is not logged in, SuiteCommerce Advanced replaces prices with a log in message and link. The user can follow this link to access a Login/Registration page where they must register on your site to view prices or make purchases. After a logged in user does not interact with the site for 30 minutes, their session ends. The first action they perform that calls a service redirects them to a Login page.

Note:

Restricting access to your entire site overrides this feature.

To enable this feature, you must set the loginToSeePrices property to true in the Configuration.js file. For detailed information about restricting all access to your site, see Restrict Access to Pricing Information

SCIS Integration

With this release of SuiteCommerce Advanced, integration with the SuiteCommerce InStore platform is now possible. SuiteCommerce InStore is a web-based point-of-sale application that uses an in-store, tablet-delivered commerce portal connected to your NetSuite backend.

With this feature enabled, you can incorporate your SuiteCommerce InStore transactions into your SuiteCommerce Advanced web site order management and billing components. With this feature, your shoppers can now:

SuiteCommerce purchases originate from either online (SCA) or in-store (SCIS) sales. In the backend, NetSuite manages these different purchase types using different types of Transaction records. For example, an order placed online through your SCA site creates a Sales Order transaction record. Another purchase placed in your store using SCIS may require the Cash Sale or the Invoice record, depending on the transaction type.

The SuiteCommerce InStore Integration feature displays all of a user’s transactions in several My Account pages, marking each as Online or In Store, regardless of the Transaction record used. This creates a seamless omni-channel experience for your customers.

Important:

Users will see an Origin column in their Purchase History and Transaction History pages where the Status column used to be. This Origin column designates the purchases’s origin as Online or In Store.

The following table lists the purchase origin (as displayed on your web site) and its associated SuiteCommerce application, transaction type, and NetSuite record.

Origin

Application

Transaction Type

Transaction Record in NetSuite

Online

SuiteCommerce Advanced

Online purchase

Shipped to a single address

Sales Order

SuiteCommerce Advanced

Online purchase

Shipped to multiple addresses

Sales Order Multi-Ship To

In Store

NetSuite

Added directly into NetSuite

Sales Order

SuiteCommerce InStore

NetSuite Point of Sale

In-store purchase

Single payment method

Cash Sale

SuiteCommerce InStore

NetSuite Point of Sale

In-store purchase

Multiple payment methods

Invoice

SuiteCommerce InStore

NetSuite Point of Sale

In-store purchase

Mixed delivery

Single payment method

Sales Order Multi-Ship To

Cash Sale

SuiteCommerce InStore

NetSuite Point of Sale

In-store purchase

Mixed delivery

Multiple payment methods

Sales Order Multi-Ship To

Invoice

To implement SCIS Integration, you must have the latest SuiteCommerce InStore and SuiteCommerce Advanced bundles installed in your account. You must also set the isSCISIntegrationEnabled property to true in the Configuration.js file. For detailed information about this feature, see SuiteCommerce InStore Integration.

Alternative Payment Methods

With this release of SuiteCommerce Advanced, setting up a third-party payment option is now available. With this feature enabled, users have the option to check out using third party companies offering payment processing services, such as Google Wallet. This selection redirects users to a third-party web site for payment. Users are then prompted to leave your site and enter the third-party payment site for authentication.

This feature does not require any code customization. However, you must set up your NetSuite account for external payments. See Alternative Payment Methods for detailed information.

Important:

To create a payment gateway to a third-party payment service provider, an administrator must install the correct SuiteApp that integrates the payment method into your account. You must install a SuiteApp developed and distributed by a SuiteCloud Developer Network (SDN) Partner. See SuiteApp.com for more information about third-party SuiteApps developed and supported by SDN Partners.

If no payment service provider offers a SuiteApp to meet your needs, you can create your own Payment Processing implementation. To build, test, and bundle a Payment Processing plug-in implementation, you must have the appropriate authorization from NetSuite. You must also be a member of the SuitePayments program. To obtain this authorization and to be considered for the program, see SuiteApp.com.

Note:

With Mont Blanc release of SuiteCommerce Advanced, the Order Details page no longer provides information about the shipping method, shipping address, billing information, or payment type.

Cancel Order

With this release of SuiteCommerce Advanced, users can now cancel a purchase that has been submitted but not processed. Users have the option of clicking a Cancel Purchase button in the Purchase Details page.

Visibility of this button is dependent on the purchase fulfillment status. If the Sales Order record’s Status field lists anything other than Pending Approval, the purchase cannot be canceled, and the Cancel Purchase button does not appear. This button appears when the Sales Order record lists any other status.

The feature does not require any setup or code customization.

Real User Monitoring (RUM) Integration

This release of SuiteCommerce Advanced provides integration for the Real User Monitoring (RUM) feature. Real User Monitoring enables you to extract and store metrics about how users interact with your website. This information is stored in a backend database in NetSuite.

You can analyze this data using tools available in an upcoming release of the Application Performance Management (APM) SuiteApp.

To implement this feature, SuiteCommerce Advanced uses the Sensor utility module. When Real User Monitoring is enabled, this module is automatically loaded when the application starts.

Google Tag Management

This release of SuiteCommerce Advanced includes the new Google Tag Manager module. GTM enables you to manage site tracking and analysis tags and code snippets on your site. This eliminates the requirement to maintain individual pieces of code for things such as Google Universal Analytics or Adwords because everything is managed through GTM. GTM is vendor neutral and enables you to manage not only Google tags, but also tags from third parties such as Bing.

The GTM Container Generator aids you in implementation of GTM by using your tracking account information to generate a JSON file. This JSON file is imported into your GTM account. For more information about implementing and using Google Tag Manager, see Google Tag Manager.

My Account Changes

With this release of SuiteCommerce Advanced, new labels on your web site’s My Account pages are displayed. In the My Account overview page, the label, Orders, in the My Account accordion list is replaced with Purchases. Also, the My Orders page is now titled My Purchases.

This is a global change and is not configurable.

URLs for Major Payment Methods

With this release, SuiteCommerce Advanced changes the way it locates Payment Method logos to display during checkout. Therefore, you must make minor changes to your NetSuite Payment Method records to display the bundled logos that were used in the previous release. These changes are described in Previous Approach.

Previous Approach

Previously, SuiteCommerce Advanced used URLs configured in the SC.Configuration.js file to locate Payment Method logos. The creditCardIcons object superseded any Flags set up in the Payment Method record in NetSuite and linked to logos that were included in the SuiteCommerce Advanced bundle.

Previous Code
          creditCardIcons: {
'VISA': 'img/visa.png'
, 'Discover': 'img/discover.png'
, 'Master Card': 'img/master.png'
, 'Maestro': 'img/maestro.png'
, 'American Express': 'img/american.png'
} 

        

Updated Approach

After migrating to the Mont Blanc release of SuiteCommerce Advanced, the SC.Configuration.js file no longer contains the creditCardIcons object. The SC.Configuration.js file now uses the paymentmethods array to point to the Payment Method record in NetSuite using the Payment Method ID.

To link to the bundled logos, enter the following links in the URL column on the Payment Visuals subtab of the associated Payment Method record in NetSuite. See Creating a Payment Method for setup instructions.

Note:

To maintain layout continuity on your SuiteCommerce Advanced site, you should use the following URLs and the logos bundled with this and previous releases. These differ from the defaults as listed in Creating a Payment Method. Ensure that each image is uploaded to your NetSuite File Cabinet in the appropriate locations.

Payment Method

URL

Visa

img/visa.png

Discover

img/discover.png

Mastercard

img/master.png

Maestro

img/maestro.png

American Express

img/american.png

Updated Code
          ,   paymentmethods: [
      {
         key: '5,5,1555641112' //'VISA'
      ,   regex: /^4[0-9]{12}(?:[0-9]{3})?$/
      }
   ,   {
         key: '4,5,1555641112' //'Master Card'
      ,   regex: /^5[1-5][0-9]{14}$/
      }
   ,   {
         key: '6,5,1555641112' //'American Express'
      ,   regex: /^3[47][0-9]{13}$/
      }
   ,   {
         key: '3,5,1555641112' // 'Discover'
      ,   regex: /^6(?:011|5[0-9]{2})[0-9]{12}$/
      }
   ,   {
         key: '16,5,1555641112' // 'Maestro'
      ,   regex: /^(?:5[0678]\d\d|6304|6390|67\d\d)\d{8,15}$/
      }
   ,   {
         key: '17,3,1555641112' // External
      ,   description: 'This company allows both private individuals and businesses to accept payments over the Internet'
      }
   ] 

        

Issue Fixes

This release includes many issue fixes including:

Product Review Records Imported by CSV are Not Displaying on Product Page

Previously, imported product review records from a comma-separated variable (CSV) file did not display on the Product Page.

To fix this problem, NetSuite updated code in the backend and released a Reference Product Review Records bundle update.

Bundle Update

NetSuite replaced the following code in the NS_PR_SS_User_Event.js file within the Reference Product Review Records bundle.

Previous Code:

          function beforeSubmit (action)
{
    'use strict';

    var user = nlapiGetUser()
    ,   new_review = nlapiGetNewRecord();
    // false when deleting
    if (new_review)
    {
        var item_id = new_review.getFieldValue('custrecord_ns_prr_item_id');
        // if the record is beeing created
        // and the user is logged in
        if (action.toString() === 'create' && user)
        {
            setReviewUser(new_review,user);
            verifyItemPurchase(new_review, user, item_id);
        }

        // if the review is not assigned to
        // the item record
        if (!new_review.getFieldValue('custrecord_ns_prr_item') && item_id)
        {
            setReviewItem(new_review, item_id);
        }
    }
} 

        

Updated Code:

          function beforeSubmit (action)
{
    'use strict';

    var new_review = nlapiGetNewRecord();
    // false when deleting
    if (new_review)
    {
        var item_id = new_review.getFieldValue('custrecord_ns_prr_item_id')
        ,        user = new_review.getFieldValue('custrecord_ns_prr_writer');
        // if the record is beeing created
        // and the user is logged in
        if (action.toString() === 'create' && user)
        {
            verifyItemPurchase(new_review, user, item_id);
        }

        // if the review is not assigned to
        // the item record
        if (!new_review.getFieldValue('custrecord_ns_prr_item') && item_id)
        {
            setReviewItem(new_review, item_id);
        }
    }
} 

        
Backend Code Update

NetSuite replaced the following code in the ProductReviews.Model.js, found in the ProductReviews@2.1.0/SuiteScript folder.

Previous Code:

          data.writer && data.writer.id && review.setFieldValue('custrecord_ns_prr_writer', data.writer.id); 

        

Updated Code:

          if(session.isLoggedIn2())
{
   review.setFieldValue('custrecord_ns_prr_writer', nlapiGetUser() + '');   
} 

        

Rejected Product Review Star Ratings Still Appearing

Previously, when a NetSuite user set a Item record’s Product Review Status field to Rejected, the associated product review still displayed on the web site’s Star Ratings area.

Reference Product Review Records bundle fixes this problem.

With this bundle update, you can go to to an item record’s SuiteCommerce Extensions tab (Product Reviews subtab) and change any Product Review’s Status field to Rejected. The rejected review will no longer appear on your site.

NetSuite replaced the following code in the NS_PR_SS_User_Event.js file within the Reference Product Review Records bundle in this release.

Previous Code:

          function getRating (id)
{
   'use strict';

   var results = nlapiSearchRecord(
      'customrecord_ns_pr_review', null
   ,   [
         new nlobjSearchFilter('isinactive', null, 'is', 'F')
      ,   new nlobjSearchFilter('custrecord_ns_prr_item', null, 'is', id)
      ,   new nlobjSearchFilter('custrecord_ns_prr_status', null, 'is', approved_status)
      ]
   ,   [
         new nlobjSearchColumn('internalid', null, 'count')
      ,   new nlobjSearchColumn('custrecord_ns_prr_rating', null, 'avg')
      ]
   );

   if (results && results.length)
   {
      return {
         count: results[0].getValue('internalid', null, 'count')
      ,   average: parseFloat(results[0].getValue('custrecord_ns_prr_rating', null, 'avg')).toFixed(1)
      };
   }

   return null;
} 

        

Updated Code:

          function getRating (id)
{
    'use strict';

    var results = nlapiSearchRecord(
        'customrecord_ns_pr_review', null
    ,   [
            new nlobjSearchFilter('isinactive', null, 'is', 'F')
        ,   new nlobjSearchFilter('custrecord_ns_prr_item', null, 'is', id)
        ,   new nlobjSearchFilter('custrecord_ns_prr_status', null, 'is', approved_status)
        ]
    ,   [
            new nlobjSearchColumn('internalid', null, 'count')
        ,   new nlobjSearchColumn('custrecord_ns_prr_rating', null, 'avg')
        ]
    );

    if (results && results.length)
    {
        var average = parseFloat(results[0].getValue('custrecord_ns_prr_rating', null, 'avg'));

        if (isNaN(average))
        {
            average = 0;
        }

        return {
            count: results[0].getValue('internalid', null, 'count')
        ,   average: average.toFixed(1)
        };
    }

    return null;
} 

        

Facet Priority Ignored When Using the URL Component as a FacetID

Previously, the faceted navigation view ignored the priority property configured in the SC.Shopping.Configuration module. Due to an error in the code, facet fields did not display as expected. The error has been corrected, and the priority property now sets the display order of the facet.

The Facets.FacetedNavigationItems function was modified in the following file: Facets.FacetedNavigation.View.js

Previous Code:

          'Facets.FacetedNavigationItems': function()
   {
      var translator = FacetsHelper.parseUrl(this.options.translatorUrl, this.options.translatorConfig)
      ,   ordered_facets = this.options.facets && this.options.facets.sort(function (a, b) {
         // Default Prioriry is 0
         return (translator.getFacetConfig(b.id).priority || 0) - (translator.getFacetConfig(a.id).priority || 0);
      }); 

        

Updated Code:

          'Facets.FacetedNavigationItems': function()
   {
      var translator = FacetsHelper.parseUrl(this.options.translatorUrl, this.options.translatorConfig)
      ,   ordered_facets = this.options.facets && this.options.facets.sort(function (a, b) {
         // Default Priority is 0
         return (translator.getFacetConfig(b.url || b.id).priority || 0) - (translator.getFacetConfig(a.url || a.id).priority || 0);
      }); 

        

Updated and New Modules

Many of the SuiteCommerce modules have been updated for this release. For a complete comparison of before and after versions, view the diff-denaliR2-montblanc-distro.patch file.

New modules for this release include the following:

General Notices