@nuskin/ns-checkout
Version:
Ecomm3 Checkout module
221 lines (198 loc) • 10.2 kB
JavaScript
import '../app.js';
import {ShopContextService, LocalStorageOrderService, ErrorMessageCookieService, CartService, AdrService} from '@nuskin/ns-shop';
import {UserService} from '@nuskin/ns-account';
import {ConfigService, RunConfigService, StickyHeaderStack} from '@nuskin/ns-util';
import {OrderList, Order} from '@nuskin/ns-checkout-common';
angular.module('checkout').controller('AdrUpdateSummaryCtrl', ['$scope','$filter','$q','$http','$location','$timeout','nsAdrOptions','nsShipping','nsTimeDelivery','nsPayment','nsProduct','nsOrder','nsUtil','nsSection', 'nsSections', 'tdcService', 'nsADRType', function($scope,$filter,$q,$http,$location,$timeout,nsAdrOptions,nsShipping,nsTimeDelivery,nsPayment,nsProduct,nsOrder,nsUtil, nsSection, nsSections, tdcService, nsADRType) {
$scope.adr = AdrService.getAdrDraft();
$scope.cart = CartService.getCart();
$scope.adrProgram = ConfigService.getMarketConfig().adrProgram;
$scope.tdc = tdcService.getTdc('checkout');
$scope.runConfig = RunConfigService.getRunConfig();
$scope.user = UserService.getUser();
$scope.error = ErrorMessageCookieService.getErrorMessages();
$scope.isBusy = false;
$scope.contentLoaded= true;
$scope.chosen = {};
$scope.iconCartUrl = RunConfigService.getBaseUrl(false) + "etc/designs/global/libs/shop/checkout/clientlib/img/icon-cart.svg";
$scope.iconSpinnerUrl = RunConfigService.getBaseUrl(false) + "etc/designs/global/libs/shop/checkout/clientlib/img/icon-spinner.gif";
$scope.secure3DImageUrl = "content/dam/icons/3D_secure.jpg";
$scope.showPsv = ShopContextService.showPsv($scope.buyer ? $scope.buyer.accountType : 0);
$scope.headerTxt = $scope.adrProgram + ' ' + $scope.adr.id;
if ($scope.adr.replaceLineItem) {
$scope.headerTxt += ' ' + $scope.tdc.replacement;
}
$scope.order = new Order({
adr: true,
countryCode: $scope.runConfig.country,
locale: $scope.runConfig.language + '_' + $scope.runConfig.country,
soldToMemberId: $scope.user.id,
custom: [],
cart: $scope.cart,
orderTotals: {},
currencyCode: $scope.runConfig.currencyCode
});
$scope.orderList = new OrderList();
$scope.orderList.addOrder($scope.order);
$('#mobile-processing').hide();
$scope.getLineItemClass = function(cartItem) {
if (cartItem && cartItem.isAdr() && !cartItem.isBusinessPortfolio()) {
return 'adrRow';
}
return 'noAdrRow';
};
$scope.getCartUrl = function() {
if ($scope.runConfig.cartUrl && $scope.runConfig.cartUrl.length > 0) {
return $scope.runConfig.cartUrl;
} else {
return 'cart.html#/cart';
}
};
$scope.processBackToCart = function () {
$('#mobile-processing').show();
StickyHeaderStack.remove();
sessionStorage.setItem('appChangeSpinner', true);
var indexOfCheckout = window.location.href.indexOf('checkout.html');
window.location = window.location.href.substr(0, indexOfCheckout) + $scope.getCartUrl();
};
$scope.updateAdr = function(element) {
if ($scope.agreeCheckbox) {
$('#agreeCheckboxText').removeClass('red');
$scope.disableOrderCreate = true;
$scope.chosen.element = element;
$scope.error.clearErrors();
ErrorMessageCookieService.resetErrorMessagesStorage();
$scope.isBusy = true;
mergeSapWithCart();
var promise = nsOrder.updateAdrItems($scope.adr, $scope.order, $scope.user).$promise;
promise.then(function () {
//Check successful http response for error messages
loadSapErrors();
$scope.chosen.isValid = true;
$timeout(function () {
$scope.chosen.isValid = false;
$scope.isBusy = false;
if (!$scope.error.hasErrorMessages()) {
$scope.order.completed = true;
LocalStorageOrderService.setOrders($scope.orderList);
$location.path("/adrUpdateConfirmation");
}
}, 1500);
}, function (err) {
// sync order with local storage
LocalStorageOrderService.setOrders($scope.orderList);
if (err.hasOwnProperty("data") && err.data.hasOwnProperty("messages")) {
loadSapErrors(err);
} else {
$scope.error.addErrorMessage("error", {text: $scope.tdc.adrUpdateFailedErrorMessage});
}
$scope.isBusy = false;
$scope.disableOrderCreate = false;
});
} else {
$('#agreeCheckboxText').addClass('red');
}
};
function mergeSapWithCart() {
var cartItems = $scope.cart.getItems({cartItems: true}),
removeKeys = [],
addItems = [];
for (var i = 0; i < cartItems.length; i++) {
var cartItem = cartItems[i];
for (var j = 0; j < $scope.adr.itemInfos.length; j++) {
var itemInfo = $scope.adr.itemInfos[j], // item already on ADR
itemJson = null;
if (cartItem.isAgelocme() && itemInfo.code) {
var agelocme = cartItem.product.agelocme; // product being added
if (agelocme.code === itemInfo.code &&
agelocme.name === itemInfo.name &&
agelocme.label === itemInfo.label) {
itemJson = cartItem.toJSON();
}
} else {
if (cartItem.product.sku === itemInfo.sku) {
itemJson = cartItem.toJSON();
}
}
if (itemJson) {
removeKeys.push(itemJson.key);
itemJson.product = cartItem.product;
itemJson.qty += itemInfo.qty;
itemJson.sapLineId = itemInfo.lineId;
addItems.push(itemJson);
}
}
}
for (var k = 0; k < removeKeys.length; k++) {
$scope.cart.removeProduct(removeKeys[k]);
}
for (var l = 0; l < addItems.length; l++) {
$scope.cart.addProduct(addItems[l]);
}
}
function loadSapErrors(err) {
var messages = $scope.order.messages;
if (err !== undefined && err.data !== undefined && err.data.messages !== undefined) {
messages = err.data.messages;
}
var i;
var fatal = false;
if (err !== undefined && err.status !== undefined && err.status !== null) {
if (err.status > 401 && err.status !== 503) {
fatal = true;
if (messages !== undefined && messages !== null) {
for (i = 0; i < messages.length; i++ ) {
if (messages[i].level == "ERROR") {
$scope.error.addErrorMessage("error", {text: messages[i].message, details: "Class-" + messages[i].type + " - Error: " + messages[i].technicalMessage});
ErrorMessageCookieService.setErrorMessages($scope.error);
break;
}
}
} else {
$scope.error.addErrorMessage("error", {text: err.data, details: "Status: " + err.status + " " + err.statusText});
ErrorMessageCookieService.setErrorMessages($scope.error);
}
$location.path("fatalError");
}
}
if (!fatal) {
//Check for out of stock items then redirect to referer
if ($scope.order.outOfStock && $scope.order.outOfStock.length > 0) {
var message = "";
if (messages && messages.length > 0 && messages[0].code == "agelocMeOutOfStock") {
message = messages[0].message;
} else {
for (i = 0; i < $scope.order.outOfStock.length; i++) {
var sku = $scope.order.outOfStock[i],
title = $scope.order.outOfStockTitle[i];
if (title && title != "null" && title != "") {
message += title + " (" + sku + "); ";
} else {
message += sku + "; ";
}
}
message += $scope.tdc.outOfStockMessage.toLowerCase();
}
$scope.error.addErrorMessage("error", {text: message});
ErrorMessageCookieService.setErrorMessages($scope.error);
//clear out of stock array so they aren't hanging around next time through if we get another error
$scope.order.clearOutOfStock();
LocalStorageOrderService.setOrders($scope.orderList);
window.location = $scope.runConfig.landing;
} else if (messages !== undefined && messages.length > 0) {
//Messages should be prioritized, so we check the first message. If it is an error then we look up the error mapping and display it.
for (i = 0; i < messages.length; i++) {
if (messages[i].level == "ERROR") {
// if the message is null replace the message with the technical message
if (messages[i].message.indexOf("null") > -1) {
messages[i].message = messages[i].technicalMessage;
}
$scope.error.addErrorMessage("error", {text: messages[i].message, details: "Class-" + messages[i].type + " - Error: " + messages[i].technicalMessage});
ErrorMessageCookieService.setErrorMessages($scope.error);
break; //We are redirecting break out
}
}
}
}
}
}]);