'use strict';
/**
* @namespace Order
*/
var server = require('server');
var Resource = require('dw/web/Resource');
var URLUtils = require('dw/web/URLUtils');
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
var userLoggedIn = require('*/cartridge/scripts/middleware/userLoggedIn');
var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
/**
* Order-Confirm : This endpoint is invoked when the shopper's Order is Placed and Confirmed
* @name Base/Order-Confirm
* @function
* @memberof Order
* @param {middleware} - consentTracking.consent
* @param {middleware} - server.middleware.https
* @param {middleware} - csrfProtection.generateToken
* @param {querystringparameter} - ID - Order ID
* @param {querystringparameter} - token - token associated with the order
* @param {category} - sensitive
* @param {serverfunction} - get
*/
server.get(
'Confirm',
consentTracking.consent,
server.middleware.https,
csrfProtection.generateToken,
function (req, res, next) {
var reportingUrlsHelper = require('*/cartridge/scripts/reportingUrls');
var OrderMgr = require('dw/order/OrderMgr');
var OrderModel = require('*/cartridge/models/order');
var Locale = require('dw/util/Locale');
var order = OrderMgr.getOrder(req.querystring.ID);
var token = req.querystring.token ? req.querystring.token : null;
if (!order
|| !token
|| token !== order.orderToken
|| order.customer.ID !== req.currentCustomer.raw.ID
) {
res.render('/error', {
message: Resource.msg('error.confirmation.error', 'confirmation', null)
});
return next();
}
var lastOrderID = Object.prototype.hasOwnProperty.call(req.session.raw.custom, 'orderID') ? req.session.raw.custom.orderID : null;
if (lastOrderID === req.querystring.ID) {
res.redirect(URLUtils.url('Home-Show'));
return next();
}
var config = {
numberOfLineItems: '*'
};
var currentLocale = Locale.getLocale(req.locale.id);
var orderModel = new OrderModel(
order,
{ config: config, countryCode: currentLocale.country, containerView: 'order' }
);
var passwordForm;
var reportingURLs = reportingUrlsHelper.getOrderReportingURLs(order);
if (!req.currentCustomer.profile) {
passwordForm = server.forms.getForm('newPasswords');
passwordForm.clear();
res.render('checkout/confirmation/confirmation', {
order: orderModel,
returningCustomer: false,
passwordForm: passwordForm,
reportingURLs: reportingURLs
});
} else {
res.render('checkout/confirmation/confirmation', {
order: orderModel,
returningCustomer: true,
reportingURLs: reportingURLs
});
}
req.session.raw.custom.orderID = req.querystring.ID; // eslint-disable-line no-param-reassign
return next();
}
);
/**
* Order-Track : This endpoint is used to track a placed Order
* @name Base/Order-Track
* @function
* @memberof Order
* @param {middleware} - consentTracking.consent
* @param {middleware} - server.middleware.https
* @param {middleware} - csrfProtection.validateRequest
* @param {middleware} - csrfProtection.generateToken
* @param {querystringparameter} - trackOrderNumber - Order Number to track
* @param {querystringparameter} - trackOrderEmail - Email on the Order to track
* @param {querystringparameter} - trackOrderPostal - Postal Code on the Order to track
* @param {querystringparameter} - csrf_token - CSRF token
* @param {querystringparameter} - submit - This is to submit the form
* @param {category} - sensitive
* @param {serverfunction} - post
*/
server.post(
'Track',
consentTracking.consent,
server.middleware.https,
csrfProtection.validateRequest,
csrfProtection.generateToken,
function (req, res, next) {
var OrderMgr = require('dw/order/OrderMgr');
var OrderModel = require('*/cartridge/models/order');
var Locale = require('dw/util/Locale');
var order;
var validForm = true;
var target = req.querystring.rurl || 1;
var actionUrl = URLUtils.url('Account-Login', 'rurl', target);
var profileForm = server.forms.getForm('profile');
profileForm.clear();
if (req.form.trackOrderEmail
&& req.form.trackOrderPostal
&& req.form.trackOrderNumber) {
order = OrderMgr.getOrder(req.form.trackOrderNumber);
} else {
validForm = false;
}
if (!order) {
res.render('/account/login', {
navTabValue: 'login',
orderTrackFormError: validForm,
profileForm: profileForm,
userName: '',
actionUrl: actionUrl
});
next();
} else {
var config = {
numberOfLineItems: '*'
};
var currentLocale = Locale.getLocale(req.locale.id);
var orderModel = new OrderModel(
order,
{ config: config, countryCode: currentLocale.country, containerView: 'order' }
);
// check the email and postal code of the form
if (req.form.trackOrderEmail.toLowerCase()
!== orderModel.orderEmail.toLowerCase()) {
validForm = false;
}
if (req.form.trackOrderPostal
!== orderModel.billing.billingAddress.address.postalCode) {
validForm = false;
}
if (validForm) {
var exitLinkText;
var exitLinkUrl;
exitLinkText = !req.currentCustomer.profile
? Resource.msg('link.continue.shop', 'order', null)
: Resource.msg('link.orderdetails.myaccount', 'account', null);
exitLinkUrl = !req.currentCustomer.profile
? URLUtils.url('Home-Show')
: URLUtils.https('Account-Show');
res.render('account/orderDetails', {
order: orderModel,
exitLinkText: exitLinkText,
exitLinkUrl: exitLinkUrl
});
} else {
res.render('/account/login', {
navTabValue: 'login',
profileForm: profileForm,
orderTrackFormError: !validForm,
userName: '',
actionUrl: actionUrl
});
}
next();
}
}
);
/**
* Order-History : This endpoint is invoked to get Order History for the logged in shopper
* @name Base/Order-History
* @function
* @memberof Order
* @param {middleware} - consentTracking.consent
* @param {middleware} - server.middleware.https
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {category} - sensitive
* @param {serverfunction} - get
*/
server.get(
'History',
consentTracking.consent,
server.middleware.https,
userLoggedIn.validateLoggedIn,
function (req, res, next) {
var OrderHelpers = require('*/cartridge/scripts/order/orderHelpers');
var ordersResult = OrderHelpers.getOrders(
req.currentCustomer,
req.querystring,
req.locale.id
);
var orders = ordersResult.orders;
var filterValues = ordersResult.filterValues;
var breadcrumbs = [
{
htmlValue: Resource.msg('global.home', 'common', null),
url: URLUtils.home().toString()
},
{
htmlValue: Resource.msg('page.title.myaccount', 'account', null),
url: URLUtils.url('Account-Show').toString()
}
];
res.render('account/order/history', {
orders: orders,
filterValues: filterValues,
orderFilter: req.querystring.orderFilter,
accountlanding: false,
breadcrumbs: breadcrumbs
});
next();
}
);
/**
* Order-Details : This endpoint is called to get Order Details
* @name Base/Order-Details
* @function
* @memberof Order
* @param {middleware} - consentTracking.consent
* @param {middleware} - server.middleware.https
* @param {middleware} - userLoggedIn.validateLoggedIn
* @param {querystringparameter} - orderID - Order ID
* @param {querystringparameter} - orderFilter - Order Filter ID
* @param {category} - sensitive
* @param {serverfunction} - get
*/
server.get(
'Details',
consentTracking.consent,
server.middleware.https,
userLoggedIn.validateLoggedIn,
function (req, res, next) {
var OrderMgr = require('dw/order/OrderMgr');
var orderHelpers = require('*/cartridge/scripts/order/orderHelpers');
var order = OrderMgr.getOrder(req.querystring.orderID);
var orderCustomerNo = req.currentCustomer.profile.customerNo;
var currentCustomerNo = order.customer.profile.customerNo;
var breadcrumbs = [
{
htmlValue: Resource.msg('global.home', 'common', null),
url: URLUtils.home().toString()
},
{
htmlValue: Resource.msg('page.title.myaccount', 'account', null),
url: URLUtils.url('Account-Show').toString()
},
{
htmlValue: Resource.msg('label.orderhistory', 'account', null),
url: URLUtils.url('Order-History').toString()
}
];
if (order && orderCustomerNo === currentCustomerNo) {
var orderModel = orderHelpers.getOrderDetails(req);
var exitLinkText = Resource.msg('link.orderdetails.orderhistory', 'account', null);
var exitLinkUrl =
URLUtils.https('Order-History', 'orderFilter', req.querystring.orderFilter);
res.render('account/orderDetails', {
order: orderModel,
exitLinkText: exitLinkText,
exitLinkUrl: exitLinkUrl,
breadcrumbs: breadcrumbs
});
} else {
res.redirect(URLUtils.url('Account-Show'));
}
next();
}
);
/**
* Order-Filtered : This endpoint filters the Orders shown on the Order History Page
* @name Base/Order-Filtered
* @function
* @memberof Order
* @param {middleware} - server.middleware.https
* @param {middleware} - consentTracking.consent
* @param {middleware} - userLoggedIn.validateLoggedInAjax
* @param {querystringparameter} - orderFilter - Order Filter ID
* @param {category} - sensitive
* @param {serverfunction} - get
*/
server.get(
'Filtered',
server.middleware.https,
consentTracking.consent,
userLoggedIn.validateLoggedInAjax,
function (req, res, next) {
var OrderHelpers = require('*/cartridge/scripts/order/orderHelpers');
var data = res.getViewData();
if (data && !data.loggedin) {
res.json();
return next();
}
var ordersResult = OrderHelpers.getOrders(
req.currentCustomer,
req.querystring,
req.locale.id
);
var orders = ordersResult.orders;
var filterValues = ordersResult.filterValues;
res.render('account/order/orderList', {
orders: orders,
filterValues: filterValues,
orderFilter: req.querystring.orderFilter,
accountlanding: false
});
return next();
}
);
/**
* Order-CreateAccount : This endpoint is invoked when a shopper has already placed an Order as a guest and then tries to create an account
* @name Base/Order-CreateAccount
* @function
* @memberof Order
* @param {middleware} - server.middleware.https
* @param {middleware} - csrfProtection.validateAjaxRequest
* @param {querystringparameter} - ID: Order ID
* @param {httpparameter} - dwfrm_newPasswords_newpassword - Password
* @param {httpparameter} - dwfrm_newPasswords_newpasswordconfirm - Conform Password
* @param {httpparameter} - csrf_token - CSRF token
* @param {category} - sensitive
* @param {serverfunction} - post
*/
server.post(
'CreateAccount',
server.middleware.https,
csrfProtection.validateAjaxRequest,
function (req, res, next) {
var OrderMgr = require('dw/order/OrderMgr');
var formErrors = require('*/cartridge/scripts/formErrors');
var passwordForm = server.forms.getForm('newPasswords');
var newPassword = passwordForm.newpassword.htmlValue;
var confirmPassword = passwordForm.newpasswordconfirm.htmlValue;
if (newPassword !== confirmPassword) {
passwordForm.valid = false;
passwordForm.newpasswordconfirm.valid = false;
passwordForm.newpasswordconfirm.error =
Resource.msg('error.message.mismatch.newpassword', 'forms', null);
}
var order = OrderMgr.getOrder(req.querystring.ID);
res.setViewData({ orderID: req.querystring.ID });
var registrationObj = {
firstName: order.billingAddress.firstName,
lastName: order.billingAddress.lastName,
phone: order.billingAddress.phone,
email: order.customerEmail,
password: newPassword
};
if (passwordForm.valid) {
res.setViewData(registrationObj);
this.on('route:BeforeComplete', function (req, res) { // eslint-disable-line no-shadow
var CustomerMgr = require('dw/customer/CustomerMgr');
var Transaction = require('dw/system/Transaction');
var accountHelpers = require('*/cartridge/scripts/helpers/accountHelpers');
var addressHelpers = require('*/cartridge/scripts/helpers/addressHelpers');
var registrationData = res.getViewData();
var login = registrationData.email;
var password = registrationData.password;
var newCustomer;
var authenticatedCustomer;
var newCustomerProfile;
var errorObj = {};
delete registrationData.email;
delete registrationData.password;
// attempt to create a new user and log that user in.
try {
Transaction.wrap(function () {
var error = {};
newCustomer = CustomerMgr.createCustomer(login, password);
var authenticateCustomerResult = CustomerMgr.authenticateCustomer(login, password);
if (authenticateCustomerResult.status !== 'AUTH_OK') {
error = { authError: true, status: authenticateCustomerResult.status };
throw error;
}
authenticatedCustomer = CustomerMgr.loginCustomer(authenticateCustomerResult, false);
if (!authenticatedCustomer) {
error = { authError: true, status: authenticateCustomerResult.status };
throw error;
} else {
// assign values to the profile
newCustomerProfile = newCustomer.getProfile();
newCustomerProfile.firstName = registrationData.firstName;
newCustomerProfile.lastName = registrationData.lastName;
newCustomerProfile.phoneHome = registrationData.phone;
newCustomerProfile.email = login;
order.setCustomer(newCustomer);
// save all used shipping addresses to address book of the logged in customer
var allAddresses = addressHelpers.gatherShippingAddresses(order);
allAddresses.forEach(function (address) {
addressHelpers.saveAddress(address, { raw: newCustomer }, addressHelpers.generateAddressName(address));
});
}
});
} catch (e) {
errorObj.error = true;
errorObj.errorMessage = e.authError
? Resource.msg('error.message.unable.to.create.account', 'login', null)
: Resource.msg('error.message.account.create.error', 'forms', null);
}
if (errorObj.error) {
res.json({ error: [errorObj.errorMessage] });
return;
}
accountHelpers.sendCreateAccountEmail(authenticatedCustomer.profile);
res.json({
success: true,
redirectUrl: URLUtils.url('Account-Show', 'registration', 'submitted').toString()
});
});
} else {
res.json({
fields: formErrors.getFormErrors(passwordForm)
});
}
return next();
}
);
module.exports = server.exports();