UNPKG

@nuskin/ns-checkout

Version:

Ecomm3 Checkout module

221 lines (198 loc) • 10.2 kB
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 } } } } } }]);