supersamApp.controller('CalcDoorsController', [ '$scope', '$http', '$timeout', 'localStorageService', '$filter', 'config', function($scope, $http, $timeout, localStorageService, $filter, config) { var calcDoorsApp; calcDoorsApp = (function() { class calcDoorsApp { constructor() { this.loadSavedOrderDataFromDB = this.loadSavedOrderDataFromDB.bind(this); this.clearPromises = this.clearPromises.bind(this); this.removeDoorOrderInfo = this.removeDoorOrderInfo.bind(this); this.isArray = this.isArray.bind(this); this.loadDoorOrderInfo = this.loadDoorOrderInfo.bind(this); this.saveDoorOrderInfo = this.saveDoorOrderInfo.bind(this); this.AutoSaveData = this.AutoSaveData.bind(this); this.confirmCleanup = this.confirmCleanup.bind(this); this.cleanup = this.cleanup.bind(this); this.openNotifyModal = this.openNotifyModal.bind(this); this.openSendOrderEmailModal = this.openSendOrderEmailModal.bind(this); this.clearCalculateLayoutAjarRequestPromise = this.clearCalculateLayoutAjarRequestPromise.bind(this); this.calculateLayout = this.calculateLayout.bind(this); this.onDoorCountChange = this.onDoorCountChange.bind(this); this.onDoorChange = this.onDoorChange.bind(this); this.bindWatches = this.bindWatches.bind(this); this.bindDoorsCountWatches = this.bindDoorsCountWatches.bind(this); this.unBindWatches = this.unBindWatches.bind(this); this.printOrder = this.printOrder.bind(this); this.printOrderConfirm = this.printOrderConfirm.bind(this); this.sendOrderEmailNotify = this.sendOrderEmailNotify.bind(this); this.onOrderInfoChange = this.onOrderInfoChange.bind(this); this.bindOrderInfoWatches = this.bindOrderInfoWatches.bind(this); this.modalScrollTo = this.modalScrollTo.bind(this); this.openSelectDoorConfigModal = this.openSelectDoorConfigModal.bind(this); this.selectDoorId = this.selectDoorId.bind(this); this.confirmDoorSelection = this.confirmDoorSelection.bind(this); this.getSelectedDoorColor = this.getSelectedDoorColor.bind(this); this.getSelectedDoorProfile = this.getSelectedDoorProfile.bind(this); this.getSelectedDoorVertHeight = this.getSelectedDoorVertHeight.bind(this); this.getManufacturerLimits = this.getManufacturerLimits.bind(this); this.isActualPriceCorrect = this.isActualPriceCorrect.bind(this); this.onFieldEnter = this.onFieldEnter.bind(this); if (config.savedOrderData) { this.loadSavedOrderDataFromDB(); } else { if (localStorageService.isSupported) { this.loadDoorOrderInfo("AutoSavedCalcDoors"); } else { this.cleanup(); } this.date = new Date(); } $scope.utilities.showContentOnLoad(); } loadSavedOrderDataFromDB() { var order; this.skipNextWatchTrigger = true; order = angular.copy(config.savedOrderData); this.orderName = (order.name ? order.name : ""); this.orderPhone = (order.phone ? order.phone : ""); this.orderEmail = (order.email ? order.email : ""); this.orderAddress = (order.address ? order.address : ""); this.orderComment = (order.comment ? order.comment : ""); this.date = new Date(order.created); this.orderNum = (order.order_num ? order.order_num : ""); this.actualPrice = (order.order_num && order.actual_price ? order.actual_price : ""); this.selectedDoorData = { params: angular.copy(order.params), order_calc_results: angular.copy(order.order_calc_results) }; if (order.order_calc_results && order.order_calc_results.price) { } else { return this.calculateLayout(); } } clearPromises() { if (this.calculateLayoutPromise) { $timeout.cancel(this.calculateLayoutPromise); return this.calculateLayoutPromise = null; } } removeDoorOrderInfo(id) { var calcDoorsParams, orderInfo; if (localStorageService.isSupported) { calcDoorsParams = localStorageService.get("calcDoorsParams"); if (calcDoorsParams && calcDoorsParams[id]) { delete calcDoorsParams[id]; localStorageService.set("calcDoorsParams", calcDoorsParams); } orderInfo = localStorageService.get("orderInfo"); if (orderInfo && orderInfo[id]) { orderInfo[id] = { orderName: this.orderName, orderPhone: this.orderPhone, orderEmail: this.orderEmail, orderAddress: this.orderAddress, orderComment: "" }; return localStorageService.set("orderInfo", orderInfo); } } } isArray(value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !value.propertyIsEnumerable('length'); } loadDoorOrderInfo(id) { var calcDoorsParams, orderInfo; if (localStorageService.isSupported) { orderInfo = localStorageService.get("orderInfo"); if (orderInfo && orderInfo[id]) { this.orderName = orderInfo[id].orderName ? angular.copy(orderInfo[id].orderName) : ""; this.orderPhone = orderInfo[id].orderPhone ? angular.copy(orderInfo[id].orderPhone) : ""; this.orderEmail = orderInfo[id].orderEmail ? angular.copy(orderInfo[id].orderEmail) : ""; this.orderAddress = orderInfo[id].orderAddress ? angular.copy(orderInfo[id].orderAddress) : ""; this.orderComment = orderInfo[id].orderComment ? angular.copy(orderInfo[id].orderComment) : ""; if (typeof orderInfo[id].skipNextWatchTrigger !== "undefined") { this.skipNextWatchTrigger = angular.copy(orderInfo[id].skipNextWatchTrigger); } else { this.skipNextWatchTrigger = true; } } calcDoorsParams = localStorageService.get("calcDoorsParams"); if (calcDoorsParams && calcDoorsParams[id] && calcDoorsParams[id].version && (calcDoorsParams[id].version === config.version)) { if (calcDoorsParams[id].selectedDoorData) { this.selectedDoorData = angular.copy(calcDoorsParams[id].selectedDoorData); delete this.selectedDoorData.eOId; return this.calculateLayout(true); } else { return this.selectedDoorData = angular.copy(this.defaultSelectedDoorData); } } else { return this.cleanup(); } } } saveDoorOrderInfo(id, label, skipNextWatchTrigger) { var calcDoorsParams, orderInfo; if (localStorageService.isSupported) { calcDoorsParams = localStorageService.get("calcDoorsParams"); if (!calcDoorsParams) { calcDoorsParams = {}; } calcDoorsParams[id] = { selectedDoorData: this.selectedDoorData, label: label, time: new Date(), version: config.version }; orderInfo = localStorageService.get("orderInfo"); if (!orderInfo) { orderInfo = {}; } //null means current trigger state - ie do not recount if only order info (name, email etc) changed if ((skipNextWatchTrigger === null) && orderInfo && orderInfo[id] && (typeof orderInfo[id].skipNextWatchTrigger !== "undefined")) { skipNextWatchTrigger = orderInfo[id].skipNextWatchTrigger; } orderInfo[id] = { orderName: this.orderName, orderPhone: this.orderPhone, orderEmail: this.orderEmail, orderAddress: this.orderAddress, orderComment: this.orderComment, skipNextWatchTrigger: skipNextWatchTrigger }; localStorageService.set("calcDoorsParams", calcDoorsParams); return localStorageService.set("orderInfo", orderInfo); } } AutoSaveData(skipNextWatchTrigger) { if (localStorageService.isSupported) { return this.saveDoorOrderInfo("AutoSavedCalcDoors", "Автоматическое сохранение", skipNextWatchTrigger); } } confirmCleanup() { this.fullOrderCleanup = false; return $timeout(() => { return angular.element(this.confirmCleanupModalId).data("backdrop", "static").modal("show"); }); } cleanup(cleanupUrlParams = false) { $timeout(() => { return angular.element(this.confirmCleanupModalId).modal("hide"); }); this.selectedDoorData = angular.copy(this.defaultSelectedDoorData); this.errors = []; this.isSubmitting = false; this.warnings = []; this.orderComment = ""; this.orderNum = ""; if (this.fullOrderCleanup) { this.orderName = ""; this.orderPhone = ""; this.orderAddress = ""; this.orderEmail = ""; } this.removeDoorOrderInfo("AutoSavedCalcDoors"); this.date = new Date(); if (cleanupUrlParams && (window.location.href.indexOf('oid') > -1)) { return window.location.replace(location.pathname); } } openNotifyModal() { return $timeout(() => { return angular.element(this.notifyModalId).modal("show"); }); } openSendOrderEmailModal() { return $timeout(() => { return angular.element(this.notifySendOrderEmailModalId).data("backdrop", "static").modal("show"); }); } clearCalculateLayoutAjarRequestPromise() { if (this.calculateLayoutAjarRequestPromise) { this.calculateLayoutAjarRequestPromise.abort(); this.calculateLayoutAjarRequestPromise = null; } if (this.calculateLayoutAjarRequestTimeoutPromise) { $timeout.cancel(this.calculateLayoutAjarRequestTimeoutPromise); return this.calculateLayoutAjarRequestTimeoutPromise = null; } } calculateLayout(immediateSync = false) { var dataToSend; if (immediateSync) { //immediate sync this.clearPromises; } this.AutoSaveData(false); if (!this.selectedDoorData.params.doorId) { return; } dataToSend = { selectedDoorData: this.selectedDoorData }; if (config.savedOrderData) { dataToSend.selectedDoorData.eOId = config.savedOrderData.eOId; } this.clearCalculateLayoutAjarRequestPromise(); this.calculateLayoutAjarRequestTimeoutPromise = $timeout(() => { this.clearCalculateLayoutAjarRequestPromise(); this.notifyMessage = "Выполнение расчет заняло слишком много времени и было отменено. Пожалуйста, уточните параметры деталей и попробуйте снова."; return this.openNotifyModal(); }, 115000); this.isSubmitting = true; return this.calculateLayoutAjarRequestPromise = $http.with_abort({ method: 'POST', url: config.calcDoorsUrl, data: dataToSend }).then((response) => { var data; this.isSubmitting = false; this.clearCalculateLayoutAjarRequestPromise(); $timeout(() => { return angular.element(this.confirmStartCutOptimizeModalId).modal("hide"); }); if (response.data) { data = response.data; if (data.warnings) { this.warnings = data.warnings; } else { this.warnings = []; } if (data.status === "success") { if (data.selectedDoorData) { this.selectedDoorData = data.selectedDoorData; return this.AutoSaveData(true); } else { return this.selectedDoorData = angular.copy(this.defaultSelectedDoorData); } } else { if (data.message) { this.notifyMessage = data.message; } else { this.notifyMessage = $scope.utilities.getConfigLabel("dataLoadingError", true); } return this.openNotifyModal(); } } }).catch(() => { this.isSubmitting = false; if (data.warnings) { this.warnings = data.warnings; } else { this.warnings = []; } this.clearCalculateLayoutAjarRequestPromise(); $timeout(() => { return angular.element(this.confirmStartCutOptimizeModalId).modal("hide"); }); this.notifyMessage = $scope.utilities.getConfigLabel("dataLoadingError", true); return this.openNotifyModal(); }); } onDoorCountChange() { if (this.selectedDoorData.params.manufacturer_id === "aristo") { if (this.selectedDoorData.params.doorsCount > 0) { return this.selectedDoorData.params.zagimDlyaShlegelya = parseInt(this.selectedDoorData.params.doorsCount) * 4; } } } onDoorChange() { if (this.selectedDoorData.params.discount) { this.selectedDoorData.params.discount = parseInt(this.selectedDoorData.params.discount); this.selectedDoorData.params.discount = Math.max(0, Math.min(this.selectedDoorData.params.discount, 100)); } if (this.skipNextWatchTrigger && (this.skipNextWatchTrigger === true)) { //ie after immediate sync after rotate this.skipNextWatchTrigger = false; return; } this.clearPromises(); return this.calculateLayoutPromise = $timeout(() => { this.AutoSaveData(false); return this.calculateLayout(); }, 1500); } bindWatches() { if (typeof this.doorParamsWatcher === "function") { this.doorParamsWatcher(); //unbind first } return this.doorParamsWatcher = $scope.$watch('calcDoors.selectedDoorData.params', $scope.calcDoors.onDoorChange, true); } bindDoorsCountWatches() { if (typeof this.doorsCountWatcher === "function") { this.doorsCountWatcher(); //unbind first } return this.doorsCountWatcher = $scope.$watch('calcDoors.selectedDoorData.params.doorsCount', $scope.calcDoors.onDoorCountChange, true); } unBindWatches() { if (typeof this.doorParamsWatcher === "function") { this.doorParamsWatcher(); } if (typeof this.doorsCountWatcher === "function") { return this.doorsCountWatcher(); } } printOrder() { if (config.additionalActionsAllowed) { if (!config.savedOrderData) { return this.sendOrderEmailNotify("printOnly"); } else { return this.printOrderConfirm(config.savedOrderData.printOrderUrl); } } } printOrderConfirm(printOrderUrl) { var printOrderWindow; if (printOrderUrl && (printOrderUrl.length > 0)) { printOrderWindow = window.open(printOrderUrl, '_blank'); printOrderWindow.focus(); return $timeout(() => { return printOrderWindow.print(); }, 1000); } } sendOrderEmailNotify(branchId) { var dataToSend; if (!this.selectedDoorData.params.doorId || $scope.calcDoorsConfigForm.$invalid || !this.isActualPriceCorrect() || this.warnings.length) { return; } if (this.isSubmitting) { this.notifyMessage = $scope.utilities.getConfigLabel("orderSendManagerCalcIsActive"); this.openNotifyModal(); return; } if (!this.isSendOrderEmailSubmitting) { this.isSendOrderEmailSubmitting = true; if ((branchId === "printOnly") || (this.orderEmail && (this.orderEmail.length > 0)) || (this.orderPhone && (this.orderPhone.length > 0))) { dataToSend = { selectedDoorData: this.selectedDoorData, orderName: this.orderName, orderPhone: this.orderPhone, orderEmail: this.orderEmail, orderAddress: this.orderAddress, orderComment: this.orderComment, branchId: branchId }; if (branchId === "printOnly") { dataToSend.printOnly = true; } else { dataToSend.orderEmailNotify = true; } if (this.orderNum && (this.orderNum.length > 0) && this.actualPrice) { dataToSend.actualPrice = this.actualPrice; } if (config.savedOrderData) { dataToSend.eOId = config.savedOrderData.eOId; } return $http({ method: 'POST', url: config.calcDoorsUrl, data: dataToSend, timeout: 60000 }).then((response) => { var data; this.isSendOrderEmailSubmitting = false; if (response.data) { data = response.data; if (branchId !== "printOnly") { if (data.orderEmailNotifySent && (data.orderEmailNotifySent === "success")) { return this.openSendOrderEmailModal(); } else { if (config.savedOrderData) { this.notifyMessage = $scope.utilities.getConfigLabel("orderSaveManagerError", true); } else { this.notifyMessage = $scope.utilities.getConfigLabel("orderSendManagerError", true); } return this.openNotifyModal(); } } else { if (data.printOrderUrl) { return this.printOrderConfirm(data.printOrderUrl); } else { this.notifyMessage = $scope.utilities.getConfigLabel("orderSaveManagerError", true); return this.openNotifyModal(); } } } }).catch((data) => { this.isSendOrderEmailSubmitting = false; if (branchId !== "printOnly") { if (!data || (data && (data !== 'canceled'))) { if (config.savedOrderData) { this.notifyMessage = $scope.utilities.getConfigLabel("orderSaveManagerError", true); } else { this.notifyMessage = $scope.utilities.getConfigLabel("orderSendManagerError", true); } return this.openNotifyModal(); } } }); } } } onOrderInfoChange() { if (this.orderInfoSaveTimeoutPromise) { $timeout.cancel(this.orderInfoSaveTimeoutPromise); this.orderInfoSaveTimeoutPromise = null; } return this.orderInfoSaveTimeoutPromise = $timeout(() => { return this.AutoSaveData(null); }, this.orderInfoSaveTimeout); } bindOrderInfoWatches() { $scope.$watch('calcDoors.orderName', $scope.calcDoors.onOrderInfoChange, true); $scope.$watch('calcDoors.orderEmail', $scope.calcDoors.onOrderInfoChange, true); $scope.$watch('calcDoors.orderPhone', $scope.calcDoors.onOrderInfoChange, true); $scope.$watch('calcDoors.orderAddress', $scope.calcDoors.onOrderInfoChange, true); return $scope.$watch('calcDoors.orderComment', $scope.calcDoors.onOrderInfoChange, true); } modalScrollTo(modalId, elementId) { return $timeout(() => { return angular.element(modalId + " .modal-body").scrollTo(elementId, 100, { offset: { top: -15 } }); }); } openSelectDoorConfigModal() { this.selectDoorConfigModalData = angular.copy(this.selectedDoorData); angular.element(this.selectDoorConfigModalId).modal("show"); return angular.element(this.selectDoorConfigModalId).on('shown.bs.modal', () => { if (this.selectDoorConfigModalData.params.doorId > 0) { this.modalScrollTo(this.selectDoorConfigModalId, "#selectDoorId" + this.selectDoorConfigModalData.params.doorId); } else { this.modalScrollTo(this.selectDoorConfigModalId, 0); } return $timeout(() => { return lozad('.img-lazy').observe(); }); }); } selectDoorId(door) { if (!this.selectDoorConfigModalData.params) { this.selectDoorConfigModalData.params = {}; } this.selectDoorConfigModalData.params.doorId = angular.copy(door.id); return this.selectDoorConfigModalData.params.manufacturer_id = angular.copy(door.manufacturer_id); } confirmDoorSelection() { var currentDoorData, forceLayoutUpdate; currentDoorData = angular.copy(this.selectedDoorData); this.selectedDoorData = angular.copy(this.selectDoorConfigModalData); if (!this.selectedDoorData.params) { this.selectedDoorData.params = {}; } forceLayoutUpdate = true; if (currentDoorData && (this.selectedDoorData.params.doorId === currentDoorData.params.doorId)) { forceLayoutUpdate = false; } this.calculateLayout(forceLayoutUpdate); return $timeout(() => { return angular.element(this.selectDoorConfigModalId).modal("hide"); }); } getSelectedDoorColor(id) { var defaultLabel, i, label, len, ref, selectedDoor, v; defaultLabel = "Не выбран"; label = { color: defaultLabel, colorNapravlyaushayaVerh: defaultLabel, colorNapravlyaushayaNiz: defaultLabel }; if (id > 0) { ref = config.doors; for (i = 0, len = ref.length; i < len; i++) { v = ref[i]; if (v.id === parseInt(id)) { selectedDoor = v; } } if (selectedDoor) { label = { color: selectedDoor.color, colorNapravlyaushayaVerh: selectedDoor.colorNapravlyaushayaVerh, colorNapravlyaushayaNiz: selectedDoor.colorNapravlyaushayaNiz }; } } return label; } getSelectedDoorProfile(id) { var i, label, len, ref, selectedDoor, v; label = "Не выбран"; if (id > 0) { ref = config.doors; for (i = 0, len = ref.length; i < len; i++) { v = ref[i]; if (v.id === parseInt(id)) { selectedDoor = v; } } if (selectedDoor) { label = selectedDoor.profile; } } return label; } getSelectedDoorVertHeight(id) { var i, label, len, ref, selectedDoor, v; label = { profileVertHeight: 2400, profileVertBelowLimit: 0, profileVertHigherLimit: 0 }; if (id > 0) { ref = config.doors; for (i = 0, len = ref.length; i < len; i++) { v = ref[i]; if (v.id === parseInt(id)) { selectedDoor = v; } } if (selectedDoor) { label = { profileVertHeight: selectedDoor.params.profileVertHeight, profileVertBelowLimit: selectedDoor.params.profileVertBelowLimit, profileVertHigherLimit: selectedDoor.params.profileVertHigherLimit }; } } return label; } getManufacturerLimits(manufacturerId) { var i, len, limits, ref, selectedManufacturer, v; limits = {}; if (manufacturerId > 0) { ref = config.doorsManufacturers; for (i = 0, len = ref.length; i < len; i++) { v = ref[i]; if (v.id === parseInt(manufacturerId)) { selectedManufacturer = v; } } if (selectedManufacturer) { limits = selectedManufacturer.limits; } } return limits; } isActualPriceCorrect() { var result; result = true; if (this.orderNum && (this.orderNum.length > 0) && this.actualPrice) { if (parseFloat(this.actualPrice) < parseFloat(this.selectedDoorData.order_calc_results.price.replaceAll(" ", ""))) { result = false; } } return result; } onFieldEnter(nextField) { if (nextField) { return $timeout(() => { return angular.element('#' + nextField).focus().select(); }); } } }; calcDoorsApp.prototype.calculateLayoutPromise = null; calcDoorsApp.prototype.calculateLayoutAjarRequestPromise = null; calcDoorsApp.calculateLayoutAjarRequestTimeoutPromise = null; calcDoorsApp.prototype.skipNextWatchTrigger = false; calcDoorsApp.prototype.orderInfoSaveTimeoutPromise = null; calcDoorsApp.prototype.orderInfoSaveTimeout = 1500; calcDoorsApp.prototype.notifyModalId = "#notifyModal"; calcDoorsApp.prototype.notifySendOrderEmailModalId = "#notifySendOrderEmailModal"; calcDoorsApp.prototype.selectDoorConfigModalId = "#selectDoorConfigModal"; calcDoorsApp.prototype.confirmCleanupModalId = "#confirmCleanupModal"; calcDoorsApp.prototype.fullOrderCleanup = false; calcDoorsApp.prototype.selectDoorConfigModalData = {}; calcDoorsApp.prototype.manufacturersSelect = null; calcDoorsApp.prototype.isSendOrderEmailSubmitting = false; calcDoorsApp.prototype.warnings = []; calcDoorsApp.prototype.isSubmitting = false; calcDoorsApp.prototype.orderName = ""; calcDoorsApp.prototype.orderEmail = ""; calcDoorsApp.prototype.orderPhone = ""; calcDoorsApp.prototype.orderAddress = ""; calcDoorsApp.prototype.defaultSelectedDoorData = { params: { manufacturer_id: null, doorId: null, height: "", width: "", discount: "" }, order_calc_results: { price: 0 } }; calcDoorsApp.prototype.searchFilter = ""; window.onbeforeprint = () => { //todo block browser print? return null; }; return calcDoorsApp; }).call(this); $scope.config = config; $scope.utilities = new UtilitiesClass(config, $filter, $timeout); $scope.calcDoors = new calcDoorsApp(); $scope.calcDoors.bindWatches(); $scope.calcDoors.bindDoorsCountWatches(); return $scope.calcDoors.bindOrderInfoWatches(); } ]);