We can add the functionality to edit the ship address on the quote review page of the website. This can be performed by creating an extension.
- The selected shipping address id will be set in the quote record. it will not be changed even we update the address.
- We will use this id to show the ship to address in Quote review page even we update the address.
- created new extension Quote edit address with vendor name JJ and version 1.0.0 to update the shipping address in quote review page of My account section
- Changed the value of the hide_edit_address_button to false by extending the OrderWizard.Module.ShowShipments in the javascript file of the extension
- In the case of the false shipping, obtained the internal id of the shipping address from the corresponding quote page and updated the QuoteToSalesOrderModel to save the internal id from quote page.
Note:
- The billing and shipping address will not updated in quote record even we update from webstore. The changes will reflect only in the sales order when we place orders.
- When we remove an address from the my account page that was chosen before we requested a quote. Once we review the quote after removing the address, it shows the shipping address as shown below.

Front end Entry point
define(
'JJ.quoteEditaddress.quoteedit', [
'JJ.quoteEditaddress.quoteedit.View', 'OrderWizard.Module.ShowShipments', 'Address.Details.View', 'Utils', 'Profile.Model', 'jQuery', 'Address.Edit.View'
],
function (
quoteeditView, OrderWizardModuleShowShipments, AddressDetailsView, Utils, ProfileModel, jQuery, AddressEditView
) {
'use strict';
//var value;
//var shipship;
return {
mountToApp: function mountToApp(container) {
// using the 'Layout' component we add a new child view inside the 'Header' existing view
// (there will be a DOM element with the HTML attribute data-view="Header.Logo")
// more documentation of the Extensibility API in
// https://system.netsuite.com/help/helpcenter/en_US/APIs/SuiteCommerce/Extensibility/Frontend/index.html
/** @type {LayoutComponent} */
var layout = container.getComponent('Layout');
if (layout) {
_.extend(OrderWizardModuleShowShipments.prototype, {
getContext: _.wrap(OrderWizardModuleShowShipments.prototype.getContext, function (fn) {
var originalRet = fn.apply(this, _.toArray(arguments).slice(1));
var shipship = originalRet.model.attributes.shipaddress;
console.log('originalRet1', originalRet);
//console.log('this1', this.step.step_url);
if (this.step.step_url === "quotetosalesorder-review") {
this.options.hide_edit_address_button = false; // to add edit button in quote ship address
_.extend(AddressEditView.prototype, {
getContext: _.wrap(AddressEditView.prototype.getContext, function (fn) {
var originalRetss = fn.apply(this, _.toArray(arguments).slice(1));
console.log("manage", originalRetss.model.attributes.internalid);
console.log("managethis", this);
return originalRetss;
}),
events: _.extend(AddressEditView.prototype.events, {
"click #in-modal-quote-edit-address": "updateShipAddress"
}),
//To update the ship address title
updateShipAddress: function () {
var fullname = this.model.get('fullname');
var value = this;
var editaddress = this.model.attributes.internalid;
var shiptoaddress = shipship;
if (editaddress === shiptoaddress) {
setTimeout(function () {
console.log("updated address", value.model.changed.fullname);
var fullnameofship = value.model.changed.fullname ? value.model.changed.fullname : fullname;
console.log("title", xx);
$('#quote-ship-to-address').html("ship to " + fullnameofship);
}, 1500);
}
},
});
}
return originalRet;
})
})
}
}
};
});
Suite script file entry Point
// JJ.quoteEditaddress.quoteedit.js
// Load all your starter dependencies in backend for your extension here
// ----------------
define('JJ.quoteEditaddress.quoteedit', [
'quoteedit.ServiceController', 'SC.Model', 'underscore', 'QuoteToSalesOrder.Model','Quote.Model'
], function (
quoteeditServiceController, SCModel, _, QuoteToSalesOrderModel, QuoteModel
) {
'use strict';
_.extend(QuoteModel, {
getExtraRecordFields: _.wrap(QuoteModel.getExtraRecordFields, function update(fn) {
var result = fn.apply(this, _.toArray(arguments).slice(1));
var shipID = this.result.shipaddress
console.error('shipID', shipID);
this.record.setFieldValue('custbody9', shipID);
this.result.shippingaddressid = this.record.getFieldValue('custbody9');
//console.error("QuoteToSalesOrderModelafter", JSON.stringify(result));
return result;
}),
});
_.extend(QuoteToSalesOrderModel, {
get: _.wrap(QuoteToSalesOrderModel.get, function (fn) {
var originalupdate = fn.apply(this, _.toArray(arguments).slice(1));
try {
//console.error("QuoteToSalesOrderModel", JSON.stringify(originalupdate));
var quoteid = originalupdate.quote_id;
//console.error('quoteid', quoteid);
var quoteObj = [];
var searchFilters = [
["type", "anyof", "Estimate"],
"AND",
["custbody9", "isnotempty", ""],
"AND",
["internalid", "anyof", quoteid]
];
var searchColumns = [
new nlobjSearchColumn("internalid", null, "GROUP"),
new nlobjSearchColumn("custbody9", null, "GROUP")
]
var estimateSearchObj = Application.getAllSearchResults('estimate', searchFilters, searchColumns) || {};
//console.error('subcustomerObj', estimateSearchObj);
var result = JSON.stringify(estimateSearchObj);
//console.error('result', result)
result = JSON.parse(result);
var idid;
if (result.length > 0) {
_.each(result, function (eachResult) {
var featuredata = {};
var columnresult = JSON.stringify(eachResult)
featuredata.internalid = (JSON.parse(columnresult).columns && JSON.parse(columnresult).columns.internalid) || '';
featuredata.shippingId = (JSON.parse(columnresult).columns && JSON.parse(columnresult).columns.custbody9) || '';
quoteObj.push(featuredata);
idid = JSON.parse(columnresult).columns.custbody9;
});
}
//console.error('productFeatures', idid);
var i = 0;
var value = originalupdate.addresses[i].internalid;
if (parseInt(value)) {
//console.error('value', value);
} else {
originalupdate.addresses[i].internalid = idid;
originalupdate.shipaddress = idid;
//console.error('resultoriginalupdate', JSON.stringify(originalupdate));
}
} catch (e) {
console.error(e)
}
return originalupdate;
})
})
});