Files
old-wiaas-legacy/api-wiaas/client/js/components/shop/shop-package-details.directive.js
2018-06-11 11:09:35 +02:00

306 lines
13 KiB
JavaScript

(function () {
global.dashModule
.controller('shopPackageDetailsCtrl', ['$scope', '$http', '$', '$translate', '$sce', 'utilsService', 'shopCartService', shopPackageDetailsController])
.directive('shopPackageDetails', [shopPackageDetailsDirective]);
function shopPackageDetailsDirective() {
return {
restrict: 'E',
templateUrl: 'shop/html/shopPackageDetailsTemplate'
};
}
function shopPackageDetailsController($scope, $http, $, $translate, $sce, utilsService, shopCartService) {
$scope.onPriceSelect = onPriceSelect;
$scope.getShopPackageDetails = getShopPackageDetails;
$scope.addToCart = addToCart;
$scope.sumPrices = sumPrices;
$scope.showInfo = showInfo;
$scope.getPriceClass = getPriceClass;
$scope.getOptionClass = getOptionClass;
$scope.getAdditionalClass = getAdditionalClass;
$scope.selectOption = selectOption;
$scope.getOptionPriceText = getOptionPriceText;
$scope.getFixedPrice = getFixedPrice;
$scope.getRecurrentPrice = getRecurrentPrice;
$scope.selectAdditional = selectAdditional;
$scope.hasOptions = hasOptions;
$scope.renderHtml = renderHtml;
$scope.showOptionInfo = showOptionInfo;
$scope.selectedPackage = {};
$scope.selectedOptions = {
other: {}
};
$scope.idCommercialLead = 0;
function renderHtml(htmlCode) {
return $sce.trustAsHtml(htmlCode);
}
function getShopPackageDetails() {
const idPackage = global.getParameterByName('idPackage') || 0;
const idCommercialLead = global.getParameterByName('idCommercialLead') || 0;
const params = $.param({
idCommercialLead,
idPackage
});
$http({
method: 'POST',
url: 'shop/api/getShopPackageDetails',
data: params
}).then(setShopPackageDetails, utilsService.onHttpError);
}
function setShopPackageDetails(response) {
if (response.data && response.data.prices && response.data.packageInfo && response.data.commercialLead) {
$scope.country = response.data.country;
$scope.selectedPackage = response.data.packageInfo;
$scope.selectedPackage.documents = response.data.documents;
$scope.selectedPackage.prices = response.data.prices || [];
$scope.selectedPackage.commercialLead = response.data.commercialLead || [];
$scope.selectedPackage.groups = response.data.groups || [];
$scope.selectedPackage.additionalPackages = response.data.additionalPackages || [];
if ($scope.selectedPackage.prices[0]) {
$scope.selectedOptions.idPaymentType = $scope.selectedPackage.prices[0].idPaymentType;
$scope.selectedOptions.price = $scope.selectedPackage.prices[0];
}
$.each($scope.selectedPackage.groups, (key, group) => {
const defaultValue = group.options.find((value) => {
return parseInt(value.isDefault) === 1;
});
$scope.selectedOptions.other[group.idGroup] = defaultValue ? defaultValue.idOptionPackage : group.options[0].idOptionPackage;
});
$scope.selectedOptions.additionalPackages = {};
updateAvailability();
}
}
function hasOptions() {
return Object.keys($scope.selectedPackage.groups).length > 0;
}
function getPriceClass(price) {
return price === $scope.selectedOptions.price ? 'selected-price' : '';
}
function getOptionClass(key, value) {
return value === $scope.selectedOptions.other[key] ? 'selected-option' : '';
}
function getAdditionalClass(key) {
return $scope.selectedOptions.additionalPackages[key] ? 'selected-option' : '';
}
function updateAvailability() {
$.each($scope.selectedPackage.groups, (key, group) => {
group.options.forEach((value) => {
value.isAvailable = getSelectedPriceForOption(value) ? true : false;
value.isInfoBoxVisible = false;
});
});
$scope.selectedPackage.additionalPackages.forEach((value) => {
value.isAvailable = getSelectedPriceForOption(value) ? true : false;
value.isInfoBoxVisible = false;
});
}
function onPriceSelect(idPaymentType) {
$scope.selectedOptions.idPaymentType = idPaymentType;
$scope.selectedOptions.price = $scope.selectedPackage.prices.filter(value => {
return value.idPaymentType === idPaymentType;
})[0];
updateAvailability();
}
function showUnavailableMessage(unavailablePackages) {
let translatedMessage = $translate.instant('shop.messages.UNAVAILABLE_PACKAGES');
unavailablePackages.forEach((unavailablePacakgeName) => {
translatedMessage += ' ' + unavailablePacakgeName + ',';
});
translatedMessage = translatedMessage.slice(0, -1);
utilsService.displayMessage('warning', translatedMessage);
}
function addToCart() {
const unavailablePackages = [];
const extraPackages = [];
Object.keys($scope.selectedOptions.additionalPackages).forEach((idAdditionalPackage) => {
if ($scope.selectedOptions.additionalPackages[idAdditionalPackage] === true) {
const extraPackage = $scope.selectedPackage.additionalPackages.find((additionalPackage) => {
return additionalPackage.idAdditionalPackage === idAdditionalPackage;
});
if (!extraPackage.isAvailable) {
unavailablePackages.push(extraPackage.packageName);
}
extraPackages.push(idAdditionalPackage);
}
});
$.each($scope.selectedOptions.other, (key, idOptionValue) => {
let extraPackage;
$.each($scope.selectedPackage.groups, (key, group) => {
if(extraPackage){
return;
}
extraPackage = group.options.find((optionPackage) => {
return optionPackage.idOptionPackage === idOptionValue;
});
});
if (!extraPackage.isAvailable) {
unavailablePackages.push(extraPackage.optionName);
}
extraPackages.push(idOptionValue);
});
if (unavailablePackages.length) {
showUnavailableMessage(unavailablePackages);
} else {
const params = $.param({
idPackage: $scope.selectedPackage.idPackage,
idPrice: $scope.selectedOptions.price.idPrice,
options: JSON.stringify(extraPackages)
});
$http({
method: 'POST',
url: 'shop/api/addToCart',
data: params
}).then(updateMessage, utilsService.onHttpError);
}
}
function updateMessage(response) {
if (typeof response.data.messages !== 'undefined') {
response.data.messages.forEach((messageObj) => {
const translatedMessage = $translate.instant('shop.messages.' + messageObj.message);
utilsService.displayMessage(messageObj.code, translatedMessage);
if (messageObj.message === 'PACKAGE_ADDED') {
shopCartService.updateShopCartCount();
}
});
}
}
function sumPrices(values) {
let total = 0;
values.forEach((val) => {
total += parseFloat(val);
});
return total;
}
function showInfo(price) {
price.isInfoVisible = !price.isInfoVisible;
}
function selectOption(key, value) {
$scope.selectedOptions.other[key] = value;
}
function selectAdditional(key) {
$scope.selectedOptions.additionalPackages[key] = !$scope.selectedOptions.additionalPackages[key];
}
function getSelectedPriceForOption(optionPackage) {
return optionPackage.prices.find((price) => {
return price.idPaymentType === $scope.selectedOptions.idPaymentType;
});
}
function getOptionPriceText(name, optionPackage) {
let optionPriceText = name + ' ';
const selectedPrice = getSelectedPriceForOption(optionPackage);
if (!selectedPrice) {
optionPriceText += '<span class="not-available">(' + $translate.instant('shop.extra.NOT_AVAILABLE') + ')</span>';
return $sce.trustAsHtml(optionPriceText);
}
const fixedPrice = selectedPrice.fixedExtra + ' ' + $scope.country.currency;
const recurentPrice = sumPrices([selectedPrice.recurentExtra, selectedPrice.servicesExtra]) + ' ' + $scope.country.currency;
if (parseFloat(fixedPrice) === 0 && parseFloat(recurentPrice) === 0) {
optionPriceText += '(' + $translate.instant('shop.extra.NO_COST') + ')';
return $sce.trustAsHtml(optionPriceText);
}
optionPriceText += parseFloat(recurentPrice) === 0 ? fixedPrice : fixedPrice + ' + (' + recurentPrice + ' / ' + selectedPrice.periodUnit + ' )';
return $sce.trustAsHtml(optionPriceText);
}
function getFixedPrice() {
let totalPrice = $scope.selectedOptions.price.fixedExtra;
$.each($scope.selectedOptions.other, (idGroup, idOptionPackage) => {
const selectedOption = $scope.selectedPackage.groups[idGroup].options.find((option) => {
return option.idOptionPackage === idOptionPackage;
});
const selectedPrice = selectedOption.prices.find((price) => {
return price.idPaymentType === $scope.selectedOptions.idPaymentType;
});
if (selectedPrice && selectedPrice.fixedExtra) {
totalPrice = sumPrices([totalPrice, selectedPrice.fixedExtra]);
}
});
$.each($scope.selectedOptions.additionalPackages, (idAdditionalPackage, value) => {
if (value === true) {
const selectedAdditional = $scope.selectedPackage.additionalPackages.find((option) => {
return option.idAdditionalPackage === idAdditionalPackage;
});
const selectedPrice = selectedAdditional.prices.find((price) => {
return price.idPaymentType === $scope.selectedOptions.idPaymentType;
});
if (selectedPrice && selectedPrice.fixedExtra) {
totalPrice = sumPrices([totalPrice, selectedPrice.fixedExtra]);
}
}
});
return totalPrice;
}
function getRecurrentPrice() {
let totalPrice = sumPrices([$scope.selectedOptions.price.recurentExtra, $scope.selectedOptions.price.servicesExtra]);
$.each($scope.selectedOptions.other, (idGroup, idOptionPackage) => {
const selectedOption = $scope.selectedPackage.groups[idGroup].options.find((option) => {
return option.idOptionPackage === idOptionPackage;
});
const selectedPrice = selectedOption.prices.find((price) => {
return price.idPaymentType === $scope.selectedOptions.idPaymentType;
});
if (selectedPrice && selectedPrice.recurentExtra && selectedPrice.servicesExtra) {
totalPrice = sumPrices([totalPrice, selectedPrice.recurentExtra, selectedPrice.servicesExtra]);
}
});
$.each($scope.selectedOptions.additionalPackages, (idAdditionalPackage, value) => {
if (value === true) {
const selectedAdditional = $scope.selectedPackage.additionalPackages.find((option) => {
return option.idAdditionalPackage === idAdditionalPackage;
});
const selectedPrice = selectedAdditional.prices.find((price) => {
return price.idPaymentType === $scope.selectedOptions.idPaymentType;
});
if (selectedPrice && selectedPrice.recurentExtra && selectedPrice.servicesExtra) {
totalPrice = sumPrices([totalPrice, selectedPrice.recurentExtra, selectedPrice.servicesExtra]);
}
}
});
return totalPrice;
}
function showOptionInfo(optionPacakge) {
optionPacakge.isInfoBoxVisible = !optionPacakge.isInfoBoxVisible;
}
}
})();