Initial commit
This commit is contained in:
@@ -0,0 +1,305 @@
|
||||
(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;
|
||||
}
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user