Initial commit
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('addVirtualProducts', addVirtualProductsDirective)
|
||||
.controller('addVirtualProductsCtrl', ['$scope', '$', '$http', '$translate', 'utilsService', 'packagesUtilsService', addVirtualProductsCtrl]);
|
||||
|
||||
function addVirtualProductsDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/addVirtualProductsTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function addVirtualProductsCtrl($scope, $, $http, $translate, utilsService, packagesUtilsService) {
|
||||
$scope.getProductCategories = getProductCategories;
|
||||
$scope.addVirtualProduct = addVirtualProduct;
|
||||
|
||||
function getProductCategories(selectedCategory = '') {
|
||||
$scope.selectedCategory = selectedCategory;
|
||||
packagesUtilsService.getProductCategories().then(showProductCategories, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showProductCategories(response) {
|
||||
$scope.productCategories = response.data && response.data.length ? response.data : [];
|
||||
}
|
||||
|
||||
function addVirtualProduct() {
|
||||
const params = $.param({
|
||||
productName: $scope.name,
|
||||
idCategory: $scope.category && $scope.category.id ? $scope.category.id : 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
data: params,
|
||||
url: 'packages/api/addVirtualProduct'
|
||||
}).then(displayMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function displayMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const translatedMessage = $translate.instant('packages.forms.messages.' + messageObj.message);
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
|
||||
if(messageObj.code === 'success') {
|
||||
$scope.name = '';
|
||||
utilsService.executeRegisteredFunction('getVirtualProductsByCategories');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,356 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('createPackagesFromTemplate', createPackagesFromTemplateDirective)
|
||||
.controller('createPackagesFromTemplateController', ['$scope', '$http', '$', '$translate', '$timeout', 'utilsService', 'packagesUtilsService', createPackagesFromTemplateCtrl]);
|
||||
|
||||
function createPackagesFromTemplateDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/createPackagesFromTemplateTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function createPackagesFromTemplateCtrl($scope, $http, $, $translate, $timeout, utilsService, packagesUtilsService) {
|
||||
const virtualCategoryNonExisting = [];
|
||||
const categories = [];
|
||||
const hasMultipleProducts = {};
|
||||
let droppedRealPackage;
|
||||
let realProductKeyReturned;
|
||||
let virtualProductKeyReturned;
|
||||
let elementDragged = '';
|
||||
$scope.isCountryAndPackageSelected = false;
|
||||
$scope.getTitle = packagesUtilsService.getTitle;
|
||||
$scope.productUnit = {};
|
||||
$scope.updateProducts = updateProducts;
|
||||
$scope.updateVirtualProducts = updateVirtualProducts;
|
||||
$scope.createPackageFromTemplate = createPackageFromTemplate;
|
||||
$scope.countrySelected = '';
|
||||
$scope.onDragStartFromProducts = onDragStartFromProducts;
|
||||
$scope.onDragStop = onDragStop;
|
||||
$scope.onDragStartFromPackage = onDragStartFromPackage;
|
||||
$scope.productDropped = productDropped;
|
||||
$scope.areTemplateAndCountrySelected = areTemplateAndCountrySelected;
|
||||
$scope.getCountryTranslationKey = getCountryTranslationKey;
|
||||
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
||||
$scope.initializeCreatePackages = initializeCreatePackages;
|
||||
$scope.packages = [];
|
||||
$scope.isCategoryInTemplate = isCategoryInTemplate;
|
||||
$scope.isAdditionalVirtualProductVisible = isAdditionalVirtualProductVisible;
|
||||
// default value for additional bussiness days for installation
|
||||
$scope.additionalInstallationDays = 5;
|
||||
$scope.selectedPackageTypeId = 1;
|
||||
$scope.getTemplateDescription = getTemplateDescription;
|
||||
$scope.tinymceOptions = utilsService.getTynimceOptions();
|
||||
$scope.uploadParams = {};
|
||||
|
||||
function initializeCreatePackages() {
|
||||
const params = {getArray: true};
|
||||
httpCall('countries/api/getAllCountries', getCountries, params);
|
||||
httpCall('packages/api/getTemplatePackages', getTemplatePackages);
|
||||
getPackageTypes();
|
||||
}
|
||||
|
||||
function getTemplateDescription() {
|
||||
const selectedTemplate = searchTemplateSelected() || {};
|
||||
return selectedTemplate.templateDescription || '';
|
||||
}
|
||||
|
||||
function getTemplatePackages(response) {
|
||||
$scope.templates = response.data;
|
||||
}
|
||||
|
||||
function getPackageTypes(){
|
||||
const params = {
|
||||
idPackage: $scope.packageSelected ? $scope.packageSelected.id : 0
|
||||
};
|
||||
httpCall('packages/api/getPackageTypes', setPackageTypes, params);
|
||||
}
|
||||
|
||||
function setPackageTypes(response){
|
||||
if(response.data && response.data.packageTypes){
|
||||
$scope.packageTypes = response.data.packageTypes;
|
||||
}
|
||||
}
|
||||
|
||||
function httpCall(httpUrl, successCallback, params) {
|
||||
const urlParams = params ? $.param(params) : {};
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: httpUrl,
|
||||
data: urlParams
|
||||
}).then(successCallback, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function areTemplateAndCountrySelected() {
|
||||
return typeof $scope.selectedCountryId !== 'undefined' && $scope.selectedCountryId !== 0 &&
|
||||
typeof $scope.idSelectedPackageTemplate !== 'undefined' && $scope.idSelectedPackageTemplate;
|
||||
}
|
||||
|
||||
function getCountryTranslationKey() {
|
||||
return $scope.countrySelected === '' ? 'SELECT_COUNTRY' : 'SELECTED_COUNTRY';
|
||||
}
|
||||
|
||||
function getProductsForPackages(response) {
|
||||
$scope.productsByCategories = typeof response.data !== 'undefined' ? response.data : [];
|
||||
getProductAndPackageCategories();
|
||||
setHeights();
|
||||
}
|
||||
|
||||
function getCountries(response) {
|
||||
if (response.data) {
|
||||
$scope.countries = response.data;
|
||||
}
|
||||
}
|
||||
|
||||
function onDragStartFromProducts(event, ui, product) {
|
||||
$('#products-list-' + product.category).css({
|
||||
overflow: 'visible'
|
||||
});
|
||||
$('.real-product-' + product.category).addClass('allowed-drop-zone');
|
||||
|
||||
droppedRealPackage = product;
|
||||
realProductKeyReturned = '';
|
||||
virtualProductKeyReturned = '';
|
||||
elementDragged = 'product';
|
||||
}
|
||||
|
||||
function onDragStartFromPackage(event, ui, virtualProductKey, realProductKey, category) {
|
||||
$('#packages-list-' + category).css({
|
||||
overflow: 'visible'
|
||||
});
|
||||
|
||||
virtualProductKeyReturned = virtualProductKey;
|
||||
realProductKeyReturned = realProductKey;
|
||||
elementDragged = 'package';
|
||||
}
|
||||
|
||||
function onDragStop(event, ui, product) {
|
||||
$('.package-list-' + product.category).css({
|
||||
'overflow-y': 'scroll'
|
||||
});
|
||||
$('.real-product-' + product.category).removeClass('allowed-drop-zone');
|
||||
|
||||
$scope.productUnit[product.idProduct] = $scope.productUnit[product.idProduct] || 1;
|
||||
}
|
||||
|
||||
function productDropped(event, ui, placeToDrop, productKey, productCategory) {
|
||||
const packageProduct = $scope.packagesByCategories[productCategory];
|
||||
|
||||
if (placeToDrop === 'package') {
|
||||
if (elementDragged !== placeToDrop && packageProduct[productKey]) {
|
||||
if (!packageProduct[productKey].real) {
|
||||
packageProduct[productKey].real = [];
|
||||
}
|
||||
|
||||
const productExists = packageProduct[productKey].real.some(product => {
|
||||
return product.idProduct === droppedRealPackage.idProduct;
|
||||
});
|
||||
if(!productExists){
|
||||
packageProduct[productKey].real.push(droppedRealPackage);
|
||||
}
|
||||
|
||||
}
|
||||
} else if (placeToDrop === 'product') {
|
||||
if (elementDragged !== placeToDrop) {
|
||||
if ((virtualProductKeyReturned in packageProduct) &&
|
||||
packageProduct[virtualProductKeyReturned].hasOwnProperty('real')) {
|
||||
|
||||
delete packageProduct[virtualProductKeyReturned].real;
|
||||
} else if (packageProduct[realProductKeyReturned] &&
|
||||
packageProduct[realProductKeyReturned].hasOwnProperty('real')) {
|
||||
|
||||
delete packageProduct[realProductKeyReturned].real;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(ui.helper).css({
|
||||
position: 'relative',
|
||||
left: 0,
|
||||
top: 0
|
||||
});
|
||||
elementDragged = '';
|
||||
}
|
||||
|
||||
function getProductAndPackageCategories() {
|
||||
if ($scope.productsByCategories) {
|
||||
Object.keys($scope.productsByCategories).forEach((category, productKey) => {
|
||||
virtualCategoryNonExisting[category] = $scope.packagesByCategories.hasOwnProperty(category);
|
||||
categories.push(category);
|
||||
if ($scope.productsByCategories[category][productKey]) {
|
||||
hasMultipleProducts[category] = $scope.productsByCategories[category][productKey].hasMultiple;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function isCategoryInTemplate(category) {
|
||||
return virtualCategoryNonExisting[category];
|
||||
}
|
||||
|
||||
function setHeights() {
|
||||
$timeout(function () {
|
||||
categories.forEach(category => {
|
||||
const packagesHeight = $('#packages-list-' + category).height() + 3;
|
||||
|
||||
$('#products-list-' + category).css({
|
||||
height: packagesHeight,
|
||||
'overflow-y': 'overlay'
|
||||
});
|
||||
|
||||
$('#pack-' + category + '-from-template-container').css({
|
||||
height: packagesHeight
|
||||
});
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
|
||||
function isAdditionalVirtualProductVisible(category) {
|
||||
return hasMultipleProducts && hasMultipleProducts[category] ? parseInt(hasMultipleProducts[category]) : 0;
|
||||
}
|
||||
|
||||
function updateProducts() {
|
||||
const idCountry = $scope.selectedCountryId;
|
||||
const params = {
|
||||
idCountry
|
||||
};
|
||||
const countryInfoSelected = $scope.countries.find(countryInfo => {
|
||||
return countryInfo.id === idCountry;
|
||||
});
|
||||
|
||||
$scope.countrySelected = countryInfoSelected.name;
|
||||
$scope.translationData = {
|
||||
country: $scope.countrySelected
|
||||
};
|
||||
$scope.isString = false;
|
||||
let productsPerType;
|
||||
for (productsPerType in $scope.packagesByCategories) {
|
||||
$scope.packagesByCategories[productsPerType].forEach(packageDetails => {
|
||||
if (packageDetails.hasOwnProperty('real')) {
|
||||
delete packageDetails.real;
|
||||
}
|
||||
});
|
||||
}
|
||||
utilsService.executeRegisteredFunction('saveCoverImage', $scope.uploadParams);
|
||||
|
||||
httpCall('packages/api/getProductsByCategory', getProductsForPackages, params);
|
||||
}
|
||||
|
||||
function updateVirtualProducts(afterCreate = false) {
|
||||
let virtualProducts = [];
|
||||
let productsByCategory;
|
||||
|
||||
if (areTemplateAndCountrySelected()) {
|
||||
$.extend(virtualProducts, searchTemplateSelected().products);
|
||||
updateProducts();
|
||||
|
||||
for (productsByCategory in virtualProducts) {
|
||||
virtualProducts[productsByCategory].forEach(virtualProduct => {
|
||||
$scope.productUnit[virtualProduct.idProduct] = parseInt(virtualProduct.quantity);
|
||||
if (afterCreate) {
|
||||
delete virtualProduct.real;
|
||||
}
|
||||
});
|
||||
}
|
||||
$scope.packagesByCategories = virtualProducts;
|
||||
setHeights();
|
||||
}
|
||||
|
||||
$scope.uploadParams = {
|
||||
shouldShowBox: false,
|
||||
idCountry: $scope.selectedCountryId || 0,
|
||||
idPackage: $scope.idSelectedPackageTemplate || 0
|
||||
};
|
||||
}
|
||||
|
||||
function createPackageFromTemplate() {
|
||||
const productsList = [];
|
||||
let packageHasRealProducts = true;
|
||||
let productsPerType;
|
||||
for (productsPerType in $scope.packagesByCategories) {
|
||||
if (!$scope.packagesByCategories[productsPerType].every(checkIfPackageHasRealProducts)) {
|
||||
packageHasRealProducts = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (packageHasRealProducts) {
|
||||
let productsPerType;
|
||||
for (productsPerType in $scope.packagesByCategories) {
|
||||
$scope.packagesByCategories[productsPerType].forEach(product => {
|
||||
product.real.forEach(realProduct => {
|
||||
realProduct.productUnit = $scope.productUnit[product.idProduct] ? $scope.productUnit[product.idProduct] : 1;
|
||||
productsList.push(realProduct);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (productsList) {
|
||||
const packageInfo = {
|
||||
packageName: $scope.packageName || '',
|
||||
packageReference: $scope.packageReference || '',
|
||||
packageDescription: $scope.packageDescription || '',
|
||||
additionalInstallationDays: $scope.additionalInstallationDays || 0,
|
||||
idCountry: $scope.selectedCountryId,
|
||||
idPackageType: $scope.selectedPackageTypeId ? $scope.selectedPackageTypeId : 0,
|
||||
idTemplate: $scope.idSelectedPackageTemplate
|
||||
};
|
||||
|
||||
const params = {
|
||||
packageData: JSON.stringify(productsList),
|
||||
packageInfo: JSON.stringify(packageInfo),
|
||||
shouldShowBox: false
|
||||
};
|
||||
|
||||
httpCall('packages/api/createPackagesData', displayMessageConfirmation, params);
|
||||
} else {
|
||||
utilsService.displayMessage('error', $translate.instant('packages.forms.messages.NO_PRODUCTS'));
|
||||
}
|
||||
} else {
|
||||
utilsService.displayMessage('error', $translate.instant('packages.forms.messages.NO_REAL_PRODUCTS'));
|
||||
}
|
||||
|
||||
function checkIfPackageHasRealProducts(product) {
|
||||
return product.hasOwnProperty('real');
|
||||
}
|
||||
}
|
||||
|
||||
function displayMessageConfirmation(response) {
|
||||
if (response.data.messageData) {
|
||||
const translationDataMessages = {
|
||||
country: $scope.countrySelected,
|
||||
packageName: $scope.packageName,
|
||||
packageReference: $scope.packageReference,
|
||||
productsNumber: response.data.productsNumber,
|
||||
field: response.data.messageData.field || ''
|
||||
};
|
||||
response.data.messageData.forEach(messageObj => {
|
||||
if (messageObj.code === 'success') {
|
||||
$scope.packageName = '';
|
||||
$scope.packageReference = '';
|
||||
$scope.packageDescription = '';
|
||||
updateVirtualProducts(true);
|
||||
} else {
|
||||
translationDataMessages.field = messageObj.field || '';
|
||||
translationDataMessages.limit = messageObj.limit || '';
|
||||
}
|
||||
|
||||
if (messageObj.message === 'PACKAGE_NAME_EXISTS') {
|
||||
$('#package-name').focus();
|
||||
}
|
||||
|
||||
const message = $translate.instant('packages.forms.messages.' + messageObj.message, translationDataMessages);
|
||||
utilsService.displayMessage(messageObj.code, message);
|
||||
});
|
||||
} else {
|
||||
const errorMessage = $translate.instant('packages.forms.messages.SERVER_ERROR');
|
||||
utilsService.displayMessage('error', errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
function searchTemplateSelected() {
|
||||
return $scope.templates.find(info => {
|
||||
return info.idTemplate === $scope.idSelectedPackageTemplate;
|
||||
});
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,9 @@
|
||||
global.dashModule
|
||||
.directive('createPackagesTemplate', createPackagesTemplateDirective);
|
||||
|
||||
function createPackagesTemplateDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/createTemplatePackagesTemplate'
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
global.dashModule
|
||||
.directive('createPackages', createPackagesDirective)
|
||||
.controller('createPackagesCtrl', ['$scope', '$http', '$', '$translate', 'utilsService', 'packagesUtilsService', createPackagesCtrl]);
|
||||
|
||||
function createPackagesDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/createPackagesTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function createPackagesCtrl($scope, $http, $, $translate, utilsService, packagesUtilsService) {
|
||||
$scope.initializeCreatePackages = initializeCreatePackages;
|
||||
$scope.isCountrySelected = isCountrySelected;
|
||||
$scope.getCountryTranslationKey = getCountryTranslationKey;
|
||||
$scope.setCountrySelectedName = setCountrySelectedName;
|
||||
|
||||
function initializeCreatePackages() {
|
||||
const params = {getArray: true};
|
||||
httpCall('countries/api/getAllCountries', getCountries, params);
|
||||
}
|
||||
|
||||
function httpCall(httpUrl, successCallback, params) {
|
||||
const urlParams = params ? $.param(params) : {};
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: httpUrl,
|
||||
data: urlParams
|
||||
}).then(successCallback, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function isCountrySelected() {
|
||||
return typeof $scope.selectedCountryId !== 'undefined' && $scope.selectedCountryId !== 0;
|
||||
}
|
||||
|
||||
function getCountries(response) {
|
||||
$scope.countries = response.data;
|
||||
}
|
||||
|
||||
function getCountryTranslationKey() {
|
||||
const countrySelected = packagesUtilsService.getCountryAndPackageSelected().countrySelected || {};
|
||||
const countryName = countrySelected.name || '';
|
||||
$scope.translationData = {
|
||||
country: countryName
|
||||
};
|
||||
return !countryName ? 'SELECT_COUNTRY' : 'SELECTED_COUNTRY';
|
||||
}
|
||||
|
||||
function setCountrySelectedName() {
|
||||
packagesUtilsService.setCountryAndPackageSelected(searchPackageNameSelected(), $scope.selectedCountryId);
|
||||
}
|
||||
|
||||
function searchPackageNameSelected() {
|
||||
const countrySelected = $scope.countries.find(info => {
|
||||
return info.id === $scope.selectedCountryId;
|
||||
});
|
||||
|
||||
return countrySelected ? countrySelected.name : '';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
(function() {
|
||||
global.dashModule.directive('displayCdnImages', displayCdnImagesDirective);
|
||||
|
||||
function displayCdnImagesDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
scope: {
|
||||
imageParams: '@'
|
||||
},
|
||||
controller: displayCdnImagesCtrl,
|
||||
templateUrl: 'packages/html/displayCdnImagesTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function displayCdnImagesCtrl($scope, $, $http, $translate, utilsService) {
|
||||
$scope.getImagesFromCdn = getImagesFromCdn;
|
||||
$scope.images = [];
|
||||
|
||||
utilsService.registerFunction('getImagesFromCdn', getImagesFromCdn);
|
||||
utilsService.registerFunction('saveCoverImage', saveCoverImage);
|
||||
|
||||
function getImagesFromCdn() {
|
||||
$scope.imageParams = typeof $scope.imageParams === 'string' && JSON.parse($scope.imageParams);
|
||||
const params = $.param({
|
||||
idCountry: $scope.imageParams.idCountry || 0,
|
||||
idPackage: $scope.imageParams.idPackage || 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getImagesFromCdn',
|
||||
data: params
|
||||
}).then(setImagesPerCountry, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function setImagesPerCountry(response) {
|
||||
if(response.data) {
|
||||
$scope.images = response.data.resources || [];
|
||||
|
||||
const coverPhoto = $scope.images.find(imageDetails => {
|
||||
return imageDetails.useAsMarketPicture === true;
|
||||
});
|
||||
|
||||
$scope.profilePicture = coverPhoto || [];
|
||||
}
|
||||
}
|
||||
|
||||
function saveCoverImage(imageParams) {
|
||||
const coverPhotoDetails = $scope.images.find(imageDetails => {
|
||||
return imageDetails.secure_url === $scope.profilePicture.secure_url;
|
||||
});
|
||||
|
||||
const params = $.param({
|
||||
idPackage: imageParams.idPackage || 0,
|
||||
publicId: coverPhotoDetails && coverPhotoDetails.public_id ? coverPhotoDetails.public_id : null
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/saveCoverPhotoForPackage',
|
||||
data: params
|
||||
}).then(displayUpdateMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function displayUpdateMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const translatedMessage = $translate.instant('packages.forms.messages.' + messageObj.message);
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,37 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('editPackageTemplates', editPackageTemplatesDirective)
|
||||
.controller('editPackageTemplatesCtrl', ['$scope', 'utilsService', 'packagesUtilsService', editPackageTemplatesCtrl]);
|
||||
|
||||
function editPackageTemplatesDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/editPackageTemplatesHtml'
|
||||
};
|
||||
}
|
||||
|
||||
function editPackageTemplatesCtrl($scope, utilsService, packagesUtilsService) {
|
||||
$scope.isPackageSelected = isPackageSelected;
|
||||
$scope.showSelectPackages = getPackageTemplates;
|
||||
$scope.packageList = [];
|
||||
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
||||
$scope.setPackageTemplateSelected = setPackageTemplateSelected;
|
||||
|
||||
function getPackageTemplates() {
|
||||
utilsService.registerFunction('setPackagesTemplates', setPackagesTemplates);
|
||||
packagesUtilsService.getPackageTemplates().then(setPackagesTemplates, global.onHttpError);
|
||||
}
|
||||
|
||||
function isPackageSelected() {
|
||||
return typeof $scope.packageSelected !== 'undefined' && $scope.packageSelected;
|
||||
}
|
||||
|
||||
function setPackagesTemplates(response) {
|
||||
$scope.packageList = response.data || [];
|
||||
}
|
||||
|
||||
function setPackageTemplateSelected() {
|
||||
packagesUtilsService.setPackageTemplateSelected($scope.packageSelected);
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,97 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('editPackages', editPackagesDirective)
|
||||
.controller('editPackagesCtrl', ['$scope', '$http', '$', '$translate', '$timeout', 'utilsService', 'packagesUtilsService', editPackagesCtrl]);
|
||||
|
||||
function editPackagesDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/editPackagesTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function editPackagesCtrl($scope, $http, $, $translate, $timeout, utilsService, packagesUtilsService) {
|
||||
$scope.getCountries = getCountries;
|
||||
$scope.isCountrySelected = isCountrySelected;
|
||||
$scope.isPackageSelected = isPackageSelected;
|
||||
$scope.showSelectPackages = getPackages;
|
||||
$scope.packageList = [];
|
||||
$scope.productUnit = [];
|
||||
$scope.getEditPackagesTitle = getEditPackagesTitle;
|
||||
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
||||
$scope.setCountryAndPackageSelected = setCountryAndPackageSelected;
|
||||
|
||||
function getCountries() {
|
||||
const params = $.param({
|
||||
getArray: true
|
||||
});
|
||||
$http({
|
||||
method: 'POST',
|
||||
data: params,
|
||||
url: 'countries/api/getAllCountries'
|
||||
}).then(setCountries, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function setCountries(response) {
|
||||
$scope.countries = response.data;
|
||||
}
|
||||
|
||||
function isCountrySelected(selectedCountryId) {
|
||||
return typeof selectedCountryId !== 'undefined' && selectedCountryId !== 0;
|
||||
}
|
||||
|
||||
function isPackageSelected() {
|
||||
return typeof $scope.packageSelected !== 'undefined' && $scope.packageSelected;
|
||||
}
|
||||
|
||||
function getPackages() {
|
||||
utilsService.registerFunction('setPackages', setPackages);
|
||||
packagesUtilsService.getPackagesPerCountry($scope.selectedCountryId).then(setPackages, global.onHttpError);
|
||||
}
|
||||
|
||||
function setPackages(response) {
|
||||
$scope.packageList = [];
|
||||
|
||||
if (response.data) {
|
||||
$timeout(() => {
|
||||
$scope.packageList = response.data && response.data.data ? response.data.data : response.data;
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function getEditPackagesTitle() {
|
||||
const translationData = {
|
||||
packageName: $scope.packageSelected ? $scope.packageSelected.name : '',
|
||||
packageReference: $scope.packageSelected ? $scope.packageSelected.reference : '',
|
||||
country: $scope.selectedCountryId && $scope.countries ? searchCountryNameSelected() : ''
|
||||
};
|
||||
|
||||
const editPackageTitle = getEditPackageTitle();
|
||||
const packageName = $scope.packageSelected ? $scope.packageSelected.name : '';
|
||||
const translatedMessage = editPackageTitle ? $translate.instant('packages.forms.' + editPackageTitle, translationData) : $scope.packageName;
|
||||
|
||||
return packageName ? packageName + translatedMessage : translatedMessage;
|
||||
}
|
||||
|
||||
function getEditPackageTitle() {
|
||||
if (typeof $scope.countrySelected === 'undefined' && typeof $scope.packageSelected === 'undefined') {
|
||||
return 'SELECT_COUNTRY_PACKAGE';
|
||||
}
|
||||
return 'SELECTED_COUNTRY';
|
||||
}
|
||||
|
||||
function setCountryAndPackageSelected() {
|
||||
if($scope.packageSelected && $scope.selectedCountryId){
|
||||
packagesUtilsService.setCountryAndPackageSelected(searchCountryNameSelected(), $scope.selectedCountryId, $scope.packageSelected);
|
||||
}
|
||||
}
|
||||
|
||||
function searchCountryNameSelected() {
|
||||
const selectedCountry = $scope.countries.find(countryInfo => {
|
||||
return countryInfo.id === $scope.selectedCountryId;
|
||||
});
|
||||
|
||||
return selectedCountry ? selectedCountry.name : '';
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,90 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.controller('myPackagesDetailsCtrl', ['$scope', '$sce', '$translate', myPackagesDetailsCtrl])
|
||||
.directive('myPackagesDetails', [myPackagesDetails]);
|
||||
|
||||
function myPackagesDetails() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/myPackagesDetails'
|
||||
};
|
||||
}
|
||||
|
||||
function myPackagesDetailsCtrl($scope, $sce, $translate) {
|
||||
$scope.isVisibleToCustomer = isVisibleToCustomer;
|
||||
$scope.sumPrices = sumPrices;
|
||||
$scope.renderHtml = renderHtml;
|
||||
$scope.hasExtraPackages = hasExtraPackages;
|
||||
$scope.areAllPayTypesAvailable = areAllPayTypesAvailable;
|
||||
$scope.showHideInfoBox = showHideInfoBox;
|
||||
$scope.getAlertClass = getAlertClass;
|
||||
$scope.getAlertText = getAlertText;
|
||||
$scope.getAlertIcon = getAlertIcon;
|
||||
$scope.getProductsArray = getProductsArray;
|
||||
$scope.productsArray = [];
|
||||
|
||||
function getAlertClass(option) {
|
||||
return !option.isAvailable ? 'alert-danger' : 'alert-warning';
|
||||
}
|
||||
|
||||
function getAlertText(option) {
|
||||
return !option.isAvailable ? $translate.instant('packages.messages.NOT_ALL_PAY_AVAILABLE') : $translate.instant('packages.messages.NOT_SET_PAYMENT');
|
||||
}
|
||||
|
||||
function getAlertIcon(option) {
|
||||
return !option.isAvailable ? 'glyphicon-ban-circle' : 'glyphicon-warning-sign';
|
||||
}
|
||||
|
||||
function renderHtml(htmlCode) {
|
||||
return $sce.trustAsHtml(htmlCode);
|
||||
}
|
||||
|
||||
function areAllPayTypesAvailable(packagePrices, optionPackage) {
|
||||
optionPackage.isAvailable = true;
|
||||
optionPackage.isSetByMe = true;
|
||||
packagePrices.forEach((value, key) => {
|
||||
optionPackage.isAvailable = optionPackage.isAvailable &&
|
||||
typeof optionPackage.prices[key] !== 'undefined' &&
|
||||
value.idPaymentType === optionPackage.prices[key];
|
||||
|
||||
optionPackage.isSetByMe = optionPackage.isSetByMe &&
|
||||
typeof optionPackage.commercialLeadPrices[key] !== 'undefined' &&
|
||||
value.idPaymentType === optionPackage.commercialLeadPrices[key];
|
||||
});
|
||||
return packagePrices.length === optionPackage.prices.length && optionPackage.isAvailable && optionPackage.isSetByMe;
|
||||
}
|
||||
|
||||
function showHideInfoBox(optionPackage) {
|
||||
optionPackage.isInfoBoxVisible = !optionPackage.isInfoBoxVisible;
|
||||
}
|
||||
|
||||
function hasExtraPackages(packageObject) {
|
||||
return packageObject.packageType === 'standard';
|
||||
}
|
||||
|
||||
function isVisibleToCustomer(visibleToCustomer) {
|
||||
const visibleClasses = {
|
||||
0: 'glyphicon-eye-close',
|
||||
1: 'glyphicon-eye-open',
|
||||
2: 'no-icon'
|
||||
};
|
||||
|
||||
return visibleClasses[visibleToCustomer];
|
||||
}
|
||||
|
||||
function sumPrices(values) {
|
||||
let total = 0;
|
||||
values.forEach((val) => {
|
||||
total += parseFloat(val);
|
||||
});
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
function getProductsArray(packageInfo) {
|
||||
if('products' in packageInfo && packageInfo.products) {
|
||||
$scope.productsArray = packageInfo.products.split(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,273 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('packageOptions', packageOptionsDirective)
|
||||
.controller('packageOptionsCtrl', ['$scope', '$', '$http', '$translate', 'utilsService', packageOptionsCtrl]);
|
||||
|
||||
function packageOptionsDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/packageOptionsTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function packageOptionsCtrl($scope, $, $http, $translate, utilsService) {
|
||||
let groupCounter = 0;
|
||||
$scope.getOptionsAndPackages = getOptionsAndPackages;
|
||||
$scope.selectPackage = selectPackage;
|
||||
$scope.getPackageClass = getPackageClass;
|
||||
$scope.isDefault = isDefault;
|
||||
$scope.addGroup = addGroup;
|
||||
$scope.removeGroup = removeGroup;
|
||||
$scope.packageDragStart = packageDragStart;
|
||||
$scope.packageDragStop = packageDragStop;
|
||||
$scope.packageOptionAdded = packageOptionAdded;
|
||||
$scope.packageOptionRemoved = packageOptionRemoved;
|
||||
$scope.setDefaultOption = setDefaultOption;
|
||||
$scope.updatePackageOptions = updatePackageOptions;
|
||||
$scope.packageAdditionalAdded = packageAdditionalAdded;
|
||||
$scope.packageAdditionalRemoved = packageAdditionalRemoved;
|
||||
$scope.getPackageWarningClass = getPackageWarningClass;
|
||||
$scope.options = [];
|
||||
$scope.standardPackages = [];
|
||||
$scope.selectedPackage = {};
|
||||
|
||||
function getOptionsAndPackages() {
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getOptionsAndPackages'
|
||||
}).then(setDocumentsAndPackages, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function setDocumentsAndPackages(response) {
|
||||
if (response.data && response.data.option && response.data.standard && response.data.additional) {
|
||||
const selectedKey = Object.keys(response.data.standard)[0];
|
||||
$scope.options = response.data.options;
|
||||
$scope.selectedPackage = response.data.standard[selectedKey] || {};
|
||||
$scope.standardPackages = response.data.standard;
|
||||
$scope.options = response.data.option;
|
||||
$scope.additionalPackages = response.data.additional;
|
||||
if(selectedKey){
|
||||
chekPricesForSelectedPackage();
|
||||
}
|
||||
|
||||
$scope.options.forEach(hideOptionPackages);
|
||||
$scope.additionalPackages.forEach(hideOptionPackages);
|
||||
} else {
|
||||
$scope.options = [];
|
||||
$scope.standardPackages = [];
|
||||
$scope.additionalPackages = [];
|
||||
}
|
||||
}
|
||||
|
||||
function chekPricesForSelectedPackage(){
|
||||
$scope.selectedPackage.groups.forEach((group) => {
|
||||
group.options.forEach((option) => {
|
||||
option.hasAllPrices = $scope.selectedPackage.prices.length === option.prices.length &&
|
||||
$scope.selectedPackage.prices.every((value, i) => value === option.prices[i]);
|
||||
});
|
||||
});
|
||||
$scope.selectedPackage.additionalPackages.forEach((additionalPackage) => {
|
||||
additionalPackage.hasAllPrices = $scope.selectedPackage.prices.length === additionalPackage.prices.length &&
|
||||
$scope.selectedPackage.prices.every((value, i) => value === additionalPackage.prices[i]);
|
||||
});
|
||||
}
|
||||
|
||||
function hideOptionPackages(currentPackage) {
|
||||
const ID_OPTION_TYPE = 2;
|
||||
const ID_ADDITIONAL_TYPE = 3;
|
||||
let iscurrentPackageInArray = false;
|
||||
|
||||
if (currentPackage.countryCode !== $scope.selectedPackage.countryCode) {
|
||||
currentPackage.isAvailable = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
currentPackage.hasAllPrices = $scope.selectedPackage.prices.length === currentPackage.prices.length &&
|
||||
$scope.selectedPackage.prices.every((value, i) => value === currentPackage.prices[i]);
|
||||
|
||||
if ($scope.selectedPackage.groups && parseInt(currentPackage.idPackageType) === ID_OPTION_TYPE) {
|
||||
$scope.selectedPackage.groups.forEach((group) => {
|
||||
iscurrentPackageInArray = iscurrentPackageInArray || findOptionPackage(group, currentPackage);
|
||||
});
|
||||
}
|
||||
if ($scope.selectedPackage.additionalPackages && parseInt(currentPackage.idPackageType) === ID_ADDITIONAL_TYPE) {
|
||||
iscurrentPackageInArray = $scope.selectedPackage.additionalPackages.find((additional) => {
|
||||
return additional.idPackage === currentPackage.idPackage;
|
||||
});
|
||||
}
|
||||
|
||||
currentPackage.isAvailable = !iscurrentPackageInArray;
|
||||
}
|
||||
|
||||
function findOptionPackage(group, currentPackage) {
|
||||
return group.options.find((option) => {
|
||||
return option.idPackage === currentPackage.idPackage;
|
||||
});
|
||||
}
|
||||
|
||||
function selectPackage(selected) {
|
||||
$scope.selectedPackage = selected;
|
||||
chekPricesForSelectedPackage();
|
||||
$scope.options.forEach(hideOptionPackages);
|
||||
$scope.additionalPackages.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function getPackageClass(curent) {
|
||||
return curent === $scope.selectedPackage ? 'selected-package' : '';
|
||||
}
|
||||
|
||||
function isDefault(option) {
|
||||
return parseInt(option.isDefault) === 1;
|
||||
}
|
||||
|
||||
function generateGroup() {
|
||||
groupCounter++;
|
||||
|
||||
return {
|
||||
groupName: '',
|
||||
idGroup: 'new-' + groupCounter,
|
||||
isNewGroup: 1,
|
||||
options: []
|
||||
};
|
||||
}
|
||||
|
||||
function addGroup() {
|
||||
$scope.selectedPackage.groups.push(generateGroup());
|
||||
}
|
||||
|
||||
function removeGroup(index) {
|
||||
$scope.selectedPackage.groups.splice(index, 1);
|
||||
$scope.options.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function packageDragStart(event, ui, selector) {
|
||||
$('#' + selector).css({
|
||||
overflow: 'visible',
|
||||
});
|
||||
$('.' + $(ui.helper).attr('drop-to')).css({
|
||||
background: 'rgba(92, 184, 92, 0.3)'
|
||||
});
|
||||
}
|
||||
|
||||
function packageDragStop(event, ui, selector) {
|
||||
$('#' + selector).css({
|
||||
'overflow': 'auto'
|
||||
});
|
||||
$('.' + $(ui.helper).attr('drop-to')).css({
|
||||
background: 'none'
|
||||
});
|
||||
}
|
||||
|
||||
function packageOptionRemoved(event, ui, dropContainer) {
|
||||
const dropToSelector = $(ui.helper).attr('drop-to');
|
||||
const idPackage = $(ui.helper).attr('id-option-package');
|
||||
const idGroup = $(ui.helper).attr('id-group');
|
||||
|
||||
if (dropContainer !== dropToSelector) {
|
||||
return;
|
||||
}
|
||||
|
||||
const group = $scope.selectedPackage.groups.find((group) => {
|
||||
return group.idGroup === idGroup;
|
||||
});
|
||||
const dragedPackageIndex = group.options.findIndex((pkg) => {
|
||||
return pkg.idPackage === idPackage;
|
||||
});
|
||||
const wasDefault = parseInt(group.options[dragedPackageIndex].isDefault) === 1;
|
||||
|
||||
group.options.splice(dragedPackageIndex, 1);
|
||||
|
||||
if (wasDefault && group.options.length) {
|
||||
setDefaultOption(group, group.options[0]);
|
||||
}
|
||||
$scope.options.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function packageOptionAdded(event, ui, dropContainer, group) {
|
||||
const dropToSelector = $(ui.helper).attr('drop-to');
|
||||
const idPackage = $(ui.helper).attr('id-option-package');
|
||||
|
||||
if (dropContainer !== dropToSelector) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dragedPackage = $scope.options.find((pkg) => {
|
||||
return pkg.idPackage === idPackage;
|
||||
});
|
||||
dragedPackage.isDefault = group.options.length ? 0 : 1;
|
||||
|
||||
group.options.push(dragedPackage);
|
||||
$scope.options.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function packageAdditionalRemoved(event, ui, dropContainer) {
|
||||
const dropToSelector = $(ui.helper).attr('drop-to');
|
||||
const idPackage = $(ui.helper).attr('id-additional-package');
|
||||
const additionalList = $scope.selectedPackage.additionalPackages;
|
||||
|
||||
if (dropContainer !== dropToSelector) {
|
||||
return;
|
||||
}
|
||||
const dragedPackageIndex = additionalList.findIndex((pkg) => {
|
||||
return pkg.idPackage === idPackage;
|
||||
});
|
||||
|
||||
additionalList.splice(dragedPackageIndex, 1);
|
||||
$scope.additionalPackages.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function packageAdditionalAdded(event, ui, dropContainer) {
|
||||
const dropToSelector = $(ui.helper).attr('drop-to');
|
||||
const idPackage = $(ui.helper).attr('id-additional-package');
|
||||
|
||||
if (dropContainer !== dropToSelector) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dragedPackage = $scope.additionalPackages.find((pkg) => {
|
||||
return pkg.idPackage === idPackage;
|
||||
});
|
||||
|
||||
$scope.selectedPackage.additionalPackages.push(dragedPackage);
|
||||
$scope.additionalPackages.forEach(hideOptionPackages);
|
||||
}
|
||||
|
||||
function setDefaultOption(group, option) {
|
||||
group.options.forEach((opt) => {
|
||||
opt.isDefault = 0;
|
||||
});
|
||||
|
||||
option.isDefault = 1;
|
||||
}
|
||||
|
||||
function updatePackageOptions() {
|
||||
const params = $.param({
|
||||
idPackage: $scope.selectedPackage.idPackage,
|
||||
groups: JSON.stringify($scope.selectedPackage.groups),
|
||||
additionalPackages: JSON.stringify($scope.selectedPackage.additionalPackages)
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/updatePackageOptions',
|
||||
data: params
|
||||
}).then(updateMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function updateMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const key = messageObj.key ? messageObj.key : '';
|
||||
let translatedMessage = $translate.instant('packages.messages.' + messageObj.message);
|
||||
translatedMessage = key !== '' ? key + ': ' + translatedMessage : translatedMessage;
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function getPackageWarningClass(arePricesAvailable) {
|
||||
return arePricesAvailable ? '' : 'alert-warning';
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,43 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.controller('packagesDetailsCtrl', ['$scope', '$sce', packagesDetailsCtrl])
|
||||
.directive('packagesDetails', [packagesDetailsDirective]);
|
||||
|
||||
function packagesDetailsDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/packagesDetailsTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function packagesDetailsCtrl($scope, $sce) {
|
||||
$scope.renderHtml = renderHtml;
|
||||
$scope.hasExtraPackages = hasExtraPackages;
|
||||
$scope.areAllPayTypesAvailable = areAllPayTypesAvailable;
|
||||
$scope.showHideInfoBox = showHideInfoBox;
|
||||
$scope.getProductsArray = getProductsArray;
|
||||
$scope.productsArray = [];
|
||||
|
||||
function renderHtml(htmlCode) {
|
||||
return $sce.trustAsHtml(htmlCode);
|
||||
}
|
||||
|
||||
function hasExtraPackages(packageObject) {
|
||||
return packageObject.packageType === 'standard';
|
||||
}
|
||||
|
||||
function areAllPayTypesAvailable(packagePrices, optionPrices){
|
||||
return packagePrices.length === optionPrices.length && packagePrices.every((v,i)=> v.idPaymentType === optionPrices[i]);
|
||||
}
|
||||
|
||||
function showHideInfoBox(optionPackage) {
|
||||
optionPackage.isInfoBoxVisible = !optionPackage.isInfoBoxVisible;
|
||||
}
|
||||
|
||||
function getProductsArray(packageInfo) {
|
||||
if('products' in packageInfo && packageInfo.products) {
|
||||
$scope.productsArray = packageInfo.products.split(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,75 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.service('packagesUtilsService', ['$http', '$', '$translate', 'utilsService', packagesUtilsService]);
|
||||
|
||||
function packagesUtilsService($http, $, $translate, utilsService) {
|
||||
let data = {};
|
||||
let packageTemplate = {};
|
||||
|
||||
return {
|
||||
getTitle,
|
||||
getProductCategories,
|
||||
setCountryAndPackageSelected,
|
||||
getCountryAndPackageSelected,
|
||||
setPackageTemplateSelected,
|
||||
getPackageTemplateSelected,
|
||||
getPackagesPerCountry,
|
||||
getPackageTemplates
|
||||
};
|
||||
|
||||
function getTitle(category, type, isTemplate) {
|
||||
const additionalTranslateName = isTemplate ? 'TEMPLATE_' : '';
|
||||
return type === 'products' ?
|
||||
$translate.instant('packages.headers.' + additionalTranslateName + category.toUpperCase() + '_PRODUCTS_BOX') :
|
||||
$translate.instant('packages.headers.' + additionalTranslateName + category.toUpperCase() + '_PACKAGES_BOX');
|
||||
}
|
||||
|
||||
function getProductCategories() {
|
||||
return $http({
|
||||
method: 'GET',
|
||||
url: 'packages/api/getProductCategories'
|
||||
});
|
||||
}
|
||||
|
||||
function setCountryAndPackageSelected(countryName, idCountry, packageSelected = {}) {
|
||||
data = {
|
||||
countrySelected: {
|
||||
id: idCountry,
|
||||
name: countryName
|
||||
},
|
||||
packageSelected
|
||||
};
|
||||
utilsService.executeRegisteredFunction('getProductsByCategories', data);
|
||||
}
|
||||
|
||||
function getCountryAndPackageSelected() {
|
||||
return data;
|
||||
}
|
||||
|
||||
function getPackagesPerCountry(idCountry) {
|
||||
return $http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getPackages',
|
||||
data: $.param({
|
||||
idCountry
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
function setPackageTemplateSelected(packageSelected) {
|
||||
packageTemplate = packageSelected;
|
||||
utilsService.executeRegisteredFunction('getVirtualProductsByCategories', packageTemplate);
|
||||
}
|
||||
|
||||
function getPackageTemplateSelected() {
|
||||
return packageTemplate;
|
||||
}
|
||||
|
||||
function getPackageTemplates() {
|
||||
return $http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getTemplatePackagesForEdit'
|
||||
});
|
||||
}
|
||||
}
|
||||
})();
|
||||
267
api-wiaas/client/js/components/packages/packages.directive.js
Normal file
267
api-wiaas/client/js/components/packages/packages.directive.js
Normal file
@@ -0,0 +1,267 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.controller('packagesController', ['$scope', '$http', '$', '$translate', '$rootScope', '$compile', 'dataTableHelper', 'utilsService', packagesController])
|
||||
.directive('packages', [packagesDirective]);
|
||||
|
||||
function packagesDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/PackagesTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function packagesController($scope, $http, $, $translate, $rootScope, $compile, dataTableHelper, utilsService) {
|
||||
const translationPath = 'packages.tables.headers.';
|
||||
let userType = 'none';
|
||||
$scope.subModule = global.getParameterByName('subModule') || 'packages';
|
||||
$scope.setSubModule = setSubModule;
|
||||
$scope.isSubmoduleVisible = isSubmoduleVisible;
|
||||
$scope.getPackages = getPackages;
|
||||
$scope.getMyPackages = getMyPackages;
|
||||
addUrlListener();
|
||||
|
||||
function addUrlListener() {
|
||||
window.addEventListener('popstate', function (e) {
|
||||
$scope.$evalAsync($scope => {
|
||||
$scope.subModule = e.state ? e.state.subModule : 'packages';
|
||||
});
|
||||
}, false);
|
||||
}
|
||||
|
||||
function setSubModule($event) {
|
||||
$scope.subModule = $event.currentTarget.attributes.subModule.value;
|
||||
history.pushState({
|
||||
subModule: $scope.subModule
|
||||
}, null, '?subModule=' + $scope.subModule);
|
||||
}
|
||||
|
||||
function isSubmoduleVisible(subModule) {
|
||||
return subModule === $scope.subModule;
|
||||
}
|
||||
|
||||
function getPackages() {
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getPackagesHeaders'
|
||||
}).then(showPackages, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showPackages(response) {
|
||||
if (typeof response.data.headers !== 'undefined') {
|
||||
userType = response.data.userType || 'none';
|
||||
const params = {
|
||||
selector: '#packages-tabel',
|
||||
url: 'packages/api/getPackages',
|
||||
hasDetails: true,
|
||||
extraTableOptions: {
|
||||
responsive: false,
|
||||
order: [
|
||||
[1, 'asc']
|
||||
]
|
||||
}
|
||||
};
|
||||
dataTableHelper.generateColumns(response.data.headers, translationPath, dataTableHelper.showTable, params, formatPackagesColumn)
|
||||
.then((table) => {
|
||||
addDetailsEvent(table, params.selector, 'packages-details');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function getMyPackages() {
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getMyPackagesHeaders'
|
||||
}).then(showMyPackages, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showMyPackages(response) {
|
||||
if (typeof response.data.headers !== 'undefined') {
|
||||
userType = response.data.userType || 'none';
|
||||
const params = {
|
||||
selector: '#my-packages-tabel',
|
||||
url: 'packages/api/getMyPackages',
|
||||
hasDetails: true,
|
||||
extraTableOptions: {
|
||||
responsive: false,
|
||||
order: [
|
||||
[1, 'asc']
|
||||
]
|
||||
}
|
||||
};
|
||||
dataTableHelper.generateColumns(response.data.headers, translationPath, dataTableHelper.showTable, params, formatPackagesColumn)
|
||||
.then((table) => {
|
||||
addDetailsEvent(table, params.selector, 'my-packages-details');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function addDetailsEvent(table, containerSelector, directiveName) {
|
||||
$(containerSelector + ' tbody').off('click', 'td.info-control');
|
||||
$(containerSelector + ' tbody').on('click', 'td.info-control', function () {
|
||||
var tr = $(this).closest('tr');
|
||||
var row = table.row(tr);
|
||||
|
||||
if (row.child.isShown()) {
|
||||
row.child.hide();
|
||||
tr.removeClass('shown');
|
||||
} else {
|
||||
const ctrl = directiveName === 'packages-details' ? 'packagesDetailsCtrl' : 'myPackagesDetailsCtrl';
|
||||
const directiveHtml = '<'+directiveName+' ng-controller="'+ctrl+'"></'+directiveName+'>';
|
||||
const scope = $rootScope.$new();
|
||||
scope.data = row.data();
|
||||
const layerSelector = 'details-layer-' + scope.data.id;
|
||||
row.child('<div id="' + layerSelector + '"></div>').show();
|
||||
|
||||
const comp = $compile($(directiveHtml))(scope);
|
||||
$('#' + layerSelector).append(comp);
|
||||
tr.addClass('shown');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function formatPackagesColumn(value, translations) {
|
||||
const columnObj = {
|
||||
data: value,
|
||||
title: translations[translationPath + value]
|
||||
};
|
||||
const renders = getPackageRenders(value);
|
||||
|
||||
columnObj.visible = isColumnVisible(value);
|
||||
|
||||
if (typeof renders[value] !== 'undefined') {
|
||||
columnObj.render = renders[value];
|
||||
}
|
||||
|
||||
return columnObj;
|
||||
}
|
||||
|
||||
function isColumnVisible(value) {
|
||||
const notVisibleFields = [
|
||||
'prices',
|
||||
'status',
|
||||
'idCountry',
|
||||
'countryCode',
|
||||
'additionalInstallationDays',
|
||||
'idPackageType',
|
||||
'description',
|
||||
'extraPackages',
|
||||
'products',
|
||||
'documents'
|
||||
];
|
||||
|
||||
return notVisibleFields.indexOf(value) === -1;
|
||||
}
|
||||
|
||||
function getPackageRenders() {
|
||||
return {
|
||||
products: packagesReplaceCommaRenderer,
|
||||
processes: showProcesses,
|
||||
name: packagesNameRenderer,
|
||||
isPriceSet: packagesIsPriceSetRenderer,
|
||||
hasDocuments: packagesHasDocumentsRenderer
|
||||
};
|
||||
|
||||
function packagesHasDocumentsRenderer(data, type, row) {
|
||||
let html = '';
|
||||
row.documents.forEach((documentObj) => {
|
||||
html += '<div class="package-documents">';
|
||||
html += '<a href="utils/api/downloadFile?idDocument='+documentObj.idDocument+'&fileName='+documentObj.documentName+'.' +documentObj.extension+'">';
|
||||
html += documentObj.documentName + '.' + documentObj.extension;
|
||||
html += '</a>';
|
||||
html += '</div>';
|
||||
});
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function packagesReplaceCommaRenderer(data) {
|
||||
return data.replace(/,/g, '<br/>');
|
||||
}
|
||||
|
||||
function showProcesses(data){
|
||||
let html = '';
|
||||
|
||||
if(data.length > 0){
|
||||
html += '<details>';
|
||||
html += '<summary>'+$translate.instant('packages.tables.extra.SEE_PROCESS')+'</summary>';
|
||||
data.forEach((process) => {
|
||||
html += '<p>' + process.processName + '</p>';
|
||||
});
|
||||
html += '</details>';
|
||||
}else{
|
||||
html = '-';
|
||||
}
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function packagesNameRenderer(data, type, row) {
|
||||
if (userType === 'commercial_lead' && $scope.subModule === 'myPackages') {
|
||||
const sellMessage = row.status === 'available' ? $translate.instant('packages.tables.extra.EDIT') : $translate.instant('packages.tables.extra.NOT_AVAILABLE');
|
||||
let newData = '<a id="edit-price-' + row.id + '" href="packages?subModule=selectPackage&idPackage=' + row.id + '">';
|
||||
newData += row.status === 'available' ?
|
||||
data + ' (' + sellMessage + ')' :
|
||||
data + ' (<div class="unavailable-products"><span class="glyphicon glyphicon-warning-sign"></span>' + sellMessage + '</div>)';
|
||||
newData += '</a>';
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function packagesIsPriceSetRenderer(data, type, row) {
|
||||
let priceText = '';
|
||||
|
||||
if (userType === 'broker') {
|
||||
if (row.status === 'not-available') {
|
||||
priceText = '<a id="set-price-' + row.id + '" href="packages?subModule=editPackages&idCountry=' + row.idCountry + '&idPackage=' + row.id + '">';
|
||||
priceText += '<div class="unavailable-products">';
|
||||
priceText += '<span class="glyphicon glyphicon-ban-circle"></span> ';
|
||||
priceText += $translate.instant('packages.tables.extra.PRODUCTS_NOT_AVAILABLE');
|
||||
priceText += '</div>';
|
||||
priceText += '</a>';
|
||||
} else if (row.processes.length === 0) {
|
||||
priceText += '<div class="set-price-text">';
|
||||
priceText += '<span class="glyphicon glyphicon-info"></span>';
|
||||
priceText += $translate.instant('packages.tables.extra.NO_PROCESS_SET');
|
||||
priceText += '</div>';
|
||||
} else {
|
||||
if (data === '0') {
|
||||
priceText = '<div class="set-price-text">';
|
||||
priceText += ' <span class="glyphicon glyphicon-euro"></span><span class="glyphicon glyphicon-remove small-price-icon"></span> ';
|
||||
priceText += $translate.instant('packages.tables.extra.SET_PRICE');
|
||||
priceText += '</div>';
|
||||
} else {
|
||||
priceText = '<div class="edit-price-text">';
|
||||
priceText += '<span class="glyphicon glyphicon-euro"></span><span class="glyphicon glyphicon-ok small-price-icon"></span> ';
|
||||
priceText += $translate.instant('packages.tables.extra.EDIT_PRICE');
|
||||
if (row.status === 'high-cost') {
|
||||
priceText += '<div class="margin-exceded">';
|
||||
priceText += '<span class="glyphicon glyphicon-warning-sign"></span> ';
|
||||
priceText += $translate.instant('packages.tables.extra.MARGIN_EXCEDED');
|
||||
priceText += '</div>';
|
||||
}
|
||||
priceText += '</div>';
|
||||
}
|
||||
|
||||
priceText = '<a id="set-price-' + row.id + '" href="packages?subModule=setPackagePrice&idPackage=' + row.id + '">' + priceText + '</a>';
|
||||
}
|
||||
|
||||
return priceText;
|
||||
}
|
||||
|
||||
if (userType === 'commercial_lead') {
|
||||
priceText = '<div class="set-price-text">';
|
||||
priceText += ' <span class="glyphicon glyphicon-euro"></span><span class="glyphicon glyphicon-ok small-price-icon"></span> ';
|
||||
priceText += $translate.instant('packages.tables.extra.SELL_THIS');
|
||||
priceText += '</div>';
|
||||
return '<a id="sell-this-' + row.id + '" href="packages?subModule=selectPackage&idPackage=' + row.id + '">' + priceText + '</a>';
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
})();
|
||||
1454
api-wiaas/client/js/components/packages/packages.less
Normal file
1454
api-wiaas/client/js/components/packages/packages.less
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,336 @@
|
||||
(function() {
|
||||
global.dashModule.directive('productsByCategoriesDragDrop', productsByCategoriesDragDropDirective);
|
||||
|
||||
function productsByCategoriesDragDropDirective() {
|
||||
return {
|
||||
restrict: 'EA',
|
||||
scope: {
|
||||
actionType: '@'
|
||||
},
|
||||
controller: productsByCategoriesDragDropCtrl,
|
||||
templateUrl: 'packages/html/productsByCategoriesDragDropTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function productsByCategoriesDragDropCtrl($scope, $, $http, $translate, utilsService, packagesUtilsService) {
|
||||
const categories = [];
|
||||
let elementDragged;
|
||||
let droppedInPackage = [];
|
||||
let droppedInProducts = [];
|
||||
$scope.packagesByCategories = {};
|
||||
$scope.productUnit = {};
|
||||
$scope.productInfo = {};
|
||||
$scope.showQuantityField = showQuantityField;
|
||||
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
||||
|
||||
$scope.getTitle = packagesUtilsService.getTitle;
|
||||
$scope.getProductsByCategories = getProductsByCategories;
|
||||
$scope.productDropped = productDropped;
|
||||
$scope.onDragStartFromProducts = onDragStartFromProducts;
|
||||
$scope.onDragStartFromPackage = onDragStartFromPackage;
|
||||
$scope.onDragStop = onDragStop;
|
||||
|
||||
$scope.getButtonTitle = getButtonTitle;
|
||||
$scope.updatePackage = updatePackage;
|
||||
$scope.resetProducts = resetProducts;
|
||||
$scope.isResetBtnVisible = isResetBtnVisible;
|
||||
$scope.isAvailableClass = isAvailableClass;
|
||||
$scope.countrySelected = {};
|
||||
$scope.packageSelected = {};
|
||||
$scope.selectedPackageTypeId = 1;
|
||||
$scope.packageTypes = [];
|
||||
|
||||
// default value for additional bussiness days for installation
|
||||
$scope.additionalInstallationDays = 5;
|
||||
$scope.packageHasInstallation = {
|
||||
create: true,
|
||||
edit: true
|
||||
};
|
||||
$scope.tinymceOptions = utilsService.getTynimceOptions();
|
||||
$scope.uploadParams = {};
|
||||
$scope.imageParams = {};
|
||||
|
||||
initProductsPerCountry();
|
||||
|
||||
function initProductsPerCountry() {
|
||||
utilsService.registerFunction('getProductsByCategories', getProductsByCategories);
|
||||
utilsService.registerFunction('getPackageTypes', getPackageTypes);
|
||||
getPackageTypes(packagesUtilsService.getCountryAndPackageSelected());
|
||||
getProductsByCategories(packagesUtilsService.getCountryAndPackageSelected());
|
||||
}
|
||||
|
||||
function httpCall(httpUrl, successCallback, params) {
|
||||
const urlParams = params
|
||||
? $.param(params)
|
||||
: {};
|
||||
$http({method: 'POST', url: httpUrl, data: urlParams}).then(successCallback, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function getButtonTitle() {
|
||||
return $translate.instant('packages.forms.buttons.' + $scope.actionType.toUpperCase() + '_PACKAGE');
|
||||
}
|
||||
|
||||
function showQuantityField(category) {
|
||||
return category !== 'installation';
|
||||
}
|
||||
|
||||
function isResetBtnVisible() {
|
||||
return $scope.actionType === 'edit';
|
||||
}
|
||||
|
||||
function getPackageTypes() {
|
||||
const params = {
|
||||
idPackage: $scope.packageSelected
|
||||
? $scope.packageSelected.id
|
||||
: 0
|
||||
};
|
||||
httpCall('packages/api/getPackageTypes', setPackageTypes, params);
|
||||
}
|
||||
|
||||
function setPackageTypes(response) {
|
||||
if (response.data && response.data.packageTypes) {
|
||||
$scope.packageTypes = response.data.packageTypes;
|
||||
}
|
||||
}
|
||||
|
||||
function getProductsByCategories(data = {}) {
|
||||
if (Object.keys(data).length > 0) {
|
||||
$scope.countrySelected = data.countrySelected || {};
|
||||
$scope.packageSelected = data.packageSelected || {};
|
||||
$scope.selectedPackageTypeId = data.packageSelected && data.packageSelected.idPackageType || null;
|
||||
}
|
||||
$scope.translationData = {
|
||||
country: $scope.countrySelected.name || ''
|
||||
};
|
||||
$scope.isString = false;
|
||||
|
||||
const params = {
|
||||
idCountry: $scope.countrySelected.id || 0,
|
||||
idPackage: $scope.packageSelected
|
||||
? $scope.packageSelected.id
|
||||
: 0
|
||||
};
|
||||
$scope.uploadParams = params;
|
||||
$scope.imageParams = params;
|
||||
if($scope.actionType === 'create') {
|
||||
$scope.uploadParams.shouldShowBox = false;
|
||||
}
|
||||
httpCall('packages/api/getProductsByCategory', setProductsByCategories, params);
|
||||
}
|
||||
|
||||
function setProductsByCategories(response) {
|
||||
$scope.productsByCategories = typeof response.data !== 'undefined'
|
||||
? response.data
|
||||
: [];
|
||||
|
||||
Object.keys($scope.productsByCategories).forEach(category => {
|
||||
categories.push(category);
|
||||
$scope.packagesByCategories[category] = [];
|
||||
});
|
||||
|
||||
if ($scope.packageSelected && $scope.packageSelected.id) {
|
||||
const params = {
|
||||
idCountry: $scope.selectedCountryId,
|
||||
idPackage: $scope.packageSelected.id
|
||||
};
|
||||
httpCall('packages/api/getProductsInPackage', showProductsForPackages, params);
|
||||
}
|
||||
}
|
||||
|
||||
function showProductsForPackages(response) {
|
||||
if (response.data.messageData) {
|
||||
const message = $translate.instant('packages.forms.messages.' + response.data.messageData.message);
|
||||
utilsService.displayMessage(response.data.messageData.code, message);
|
||||
} else {
|
||||
setProductsFromPackage(response.data);
|
||||
}
|
||||
}
|
||||
|
||||
function setProductsFromPackage(packageProductsData) {
|
||||
$scope.packageName = $scope.packageSelected.name || '';
|
||||
$scope.packageReference = $scope.packageSelected.reference || '';
|
||||
$scope.packageDescription = $scope.packageSelected.description || '';
|
||||
$scope.additionalInstallationDays = parseInt($scope.packageSelected.additionalInstallationDays) || 0;
|
||||
$scope.packagesByCategories = packageProductsData;
|
||||
Object.keys($scope.packagesByCategories).forEach(category => {
|
||||
$scope.packagesByCategories[category].forEach(packageProduct => {
|
||||
$scope.productUnit[packageProduct.idProduct] = parseInt(packageProduct.quantity);
|
||||
});
|
||||
});
|
||||
if ($scope.actionType === 'edit') {
|
||||
$scope.packageHasInstallation.edit = 'installation' in $scope.packagesByCategories && $scope.packagesByCategories.installation.length > 0
|
||||
? true
|
||||
: false;
|
||||
}
|
||||
}
|
||||
|
||||
function onDragStartFromProducts(event, ui, product, productKey) {
|
||||
$('#package-products-list-' + product.category).css({overflow: 'visible'});
|
||||
$('.' + product.category + '-in-package').addClass('allowed-drop-zone');
|
||||
|
||||
droppedInPackage = {
|
||||
key: productKey,
|
||||
value: product
|
||||
};
|
||||
droppedInProducts = {};
|
||||
elementDragged = 'product';
|
||||
}
|
||||
|
||||
function onDragStartFromPackage(event, ui, product, productKey) {
|
||||
$('#packages-list-' + product.category).css({overflow: 'visible'});
|
||||
|
||||
droppedInProducts = {
|
||||
key: productKey,
|
||||
value: product
|
||||
};
|
||||
droppedInPackage = {};
|
||||
elementDragged = 'package';
|
||||
}
|
||||
|
||||
function onDragStop(event, ui, product) {
|
||||
$('.package-list-' + product.category).css({'overflow': 'auto'});
|
||||
$('.' + product.category + '-in-package').removeClass('allowed-drop-zone');
|
||||
|
||||
$scope.productUnit[product.idProduct] = $scope.productUnit[product.idProduct] || 1;
|
||||
}
|
||||
|
||||
function productDropped(event, ui, placeToDrop, productCategory) {
|
||||
if (elementDragged !== placeToDrop) {
|
||||
if (!$scope.packagesByCategories[productCategory]) {
|
||||
$scope.packagesByCategories[productCategory] = [];
|
||||
}
|
||||
if (placeToDrop === 'package') {
|
||||
const productExists = $scope.packagesByCategories[productCategory].some(product => {
|
||||
return product.idProduct === droppedInPackage.value.idProduct;
|
||||
});
|
||||
if (productExists) {
|
||||
$scope.productUnit[droppedInPackage.value.idProduct]++;
|
||||
} else {
|
||||
$scope.packagesByCategories[productCategory].push(droppedInPackage.value);
|
||||
}
|
||||
} else if (placeToDrop === 'product') {
|
||||
$scope.productUnit[droppedInProducts.value.idProduct] = 1;
|
||||
$scope.packagesByCategories[productCategory].splice(droppedInProducts.key, 1);
|
||||
}
|
||||
|
||||
$scope.packageHasInstallation.edit = $scope.actionType === 'edit' && $scope.packagesByCategories.installation && $scope.packagesByCategories.installation.length > 0
|
||||
? true
|
||||
: false;
|
||||
}
|
||||
|
||||
$(ui.helper).css({position: 'relative', left: 0, top: 0});
|
||||
elementDragged = '';
|
||||
}
|
||||
|
||||
function updatePackage() {
|
||||
const productsInPackageList = [];
|
||||
let productsPerType;
|
||||
|
||||
for (productsPerType in $scope.packagesByCategories) {
|
||||
$scope.packagesByCategories[productsPerType].forEach(product => {
|
||||
product.productUnit = $scope.productUnit[product.idProduct] || 1;
|
||||
productsInPackageList.push(product);
|
||||
});
|
||||
}
|
||||
|
||||
const packageInfo = {
|
||||
packageName: $scope.packageName || '',
|
||||
packageReference: $scope.packageReference || '',
|
||||
packageDescription: $scope.packageDescription || '',
|
||||
additionalInstallationDays: $scope.additionalInstallationDays || 0,
|
||||
idCountry: $scope.countrySelected.id || 0,
|
||||
idPackage: $scope.packageSelected && $scope.packageSelected.id
|
||||
? $scope.packageSelected.id
|
||||
: 0,
|
||||
idPackageType: $scope.selectedPackageTypeId
|
||||
? $scope.selectedPackageTypeId
|
||||
: 0,
|
||||
isForEdit: $scope.actionType === 'create'
|
||||
? false
|
||||
: true
|
||||
};
|
||||
|
||||
const params = {
|
||||
packageData: JSON.stringify(productsInPackageList),
|
||||
packageInfo: JSON.stringify(packageInfo)
|
||||
};
|
||||
|
||||
utilsService.executeRegisteredFunction('saveCoverImage', $scope.imageParams);
|
||||
|
||||
if ($scope.actionType === 'create') {
|
||||
httpCall('packages/api/createPackagesData', showConfirmationMessage, params);
|
||||
} else if ($scope.actionType === 'edit') {
|
||||
httpCall('packages/api/updateInformationDataInPackage', showConfirmationMessage, params);
|
||||
}
|
||||
}
|
||||
|
||||
function showConfirmationMessage(response) {
|
||||
if (response.data && typeof response.data.messageData !== 'undefined') {
|
||||
const translationDataMessages = {
|
||||
country: $scope.countrySelected.name || '',
|
||||
packageName: $scope.packageName,
|
||||
packageReference: $scope.packageReference,
|
||||
productsNumber: response.data.productsNumber || 0
|
||||
};
|
||||
|
||||
if (response.data.messageData.message === 'PACKAGE_NAME_EXISTS') {
|
||||
$('#packageName').focus();
|
||||
}
|
||||
|
||||
response.data.messageData.forEach(messageObj => {
|
||||
translationDataMessages.field = messageObj.field || '';
|
||||
const message = $translate.instant('packages.forms.messages.' + messageObj.message, translationDataMessages);
|
||||
utilsService.displayMessage(messageObj.code, message);
|
||||
|
||||
if (messageObj.code === 'success') {
|
||||
if ($scope.actionType === 'create') {
|
||||
$scope.packageName = '';
|
||||
$scope.packageReference = '';
|
||||
$scope.packageDescription = '';
|
||||
Object.keys($scope.productUnit).map(idProduct => {
|
||||
$scope.productUnit[idProduct] = 1;
|
||||
});
|
||||
getProductsByCategories();
|
||||
} else if ($scope.actionType === 'edit') {
|
||||
$scope.packageUpdated = response.data.packageUpdated;
|
||||
packagesUtilsService.getPackagesPerCountry($scope.countrySelected.id).then(setPackageAfterEdit, global.onHttpError);
|
||||
}
|
||||
} else {
|
||||
if (response.data.messageData.type && response.data.messageData.limit) {
|
||||
translationDataMessages.type = response.data.messageData.type;
|
||||
translationDataMessages.limit = response.data.messageData.limit;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
const errorMessage = $translate.instant('packages.forms.messages.SERVER_ERROR');
|
||||
utilsService.displayMessage('error', errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
function setPackageAfterEdit(response) {
|
||||
if (response.data) {
|
||||
utilsService.executeRegisteredFunction('setPackages', response.data);
|
||||
$scope.packageSelected = {
|
||||
id: $scope.packageUpdated.idPackage,
|
||||
name: $scope.packageUpdated.packageName,
|
||||
reference: $scope.packageUpdated.packageReference,
|
||||
description: $scope.packageUpdated.packageDescription
|
||||
};
|
||||
packagesUtilsService.setCountryAndPackageSelected($scope.countrySelected.name, $scope.countrySelected.id, $scope.packageSelected);
|
||||
}
|
||||
}
|
||||
|
||||
function resetProducts() {
|
||||
getProductsByCategories();
|
||||
const message = $translate.instant('packages.forms.messages.RESET_PACKAGE');
|
||||
utilsService.displayMessage('success', message);
|
||||
}
|
||||
|
||||
function isAvailableClass(isAvailable) {
|
||||
return typeof isAvailable !== 'undefined' && parseInt(isAvailable) === 0
|
||||
? 'not-available-prdocut'
|
||||
: '';
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,269 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.directive('productsTemplateByCategoriesDragDrop', productsTemplateByCategoriesDragDropDirective);
|
||||
|
||||
function productsTemplateByCategoriesDragDropDirective() {
|
||||
return {
|
||||
restrict: 'EA',
|
||||
scope: {
|
||||
actionType: '@'
|
||||
},
|
||||
controller: productsTemplateByCategoriesDragDropCtrl,
|
||||
templateUrl: 'packages/html/productsTemplateByCategoriesDragDropTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function productsTemplateByCategoriesDragDropCtrl($scope, $, $http, $translate, utilsService, packagesUtilsService) {
|
||||
const categories = [];
|
||||
let elementDragged;
|
||||
let droppedInPackage = [];
|
||||
let droppedInProducts = [];
|
||||
let addingNewVirtualProduct;
|
||||
$scope.packagesByCategories = {};
|
||||
$scope.productUnit = {};
|
||||
$scope.productInfo = {};
|
||||
$scope.isProductSelected = isProductSelected;
|
||||
$scope.showQuantityField = showQuantityField;
|
||||
$scope.checkQuantityAmount = utilsService.verifyAmountAdded;
|
||||
|
||||
$scope.getTitle = packagesUtilsService.getTitle;
|
||||
$scope.getVirtualProductsByCategories = getVirtualProductsByCategories;
|
||||
$scope.productDropped = productDropped;
|
||||
$scope.onDragStartFromProducts = onDragStartFromProducts;
|
||||
$scope.onDragStartFromPackage = onDragStartFromPackage;
|
||||
$scope.onDragStop = onDragStop;
|
||||
|
||||
$scope.getButtonTitle = getButtonTitle;
|
||||
$scope.updatePackage = updatePackage;
|
||||
$scope.resetProducts = resetProducts;
|
||||
$scope.isResetBtnVisible = isResetBtnVisible;
|
||||
$scope.isAddVirtualProductsFormVisible = isAddVirtualProductsFormVisible;
|
||||
$scope.enableAddNewVirtualProducts = enableAddNewVirtualProducts;
|
||||
$scope.countrySelected = {};
|
||||
$scope.packageSelected = {};
|
||||
|
||||
initProducts();
|
||||
|
||||
function initProducts() {
|
||||
utilsService.registerFunction('getVirtualProductsByCategories', getVirtualProductsByCategories);
|
||||
getVirtualProductsByCategories(packagesUtilsService.getPackageTemplateSelected());
|
||||
}
|
||||
|
||||
function httpCall(httpUrl, successCallback, params) {
|
||||
const urlParams = params ? $.param(params) : {};
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: httpUrl,
|
||||
data: urlParams
|
||||
}).then(successCallback, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function getButtonTitle() {
|
||||
return $translate.instant('packages.buttons.' + $scope.actionType.toUpperCase() + '_TEMPLATE_PACKAGES');
|
||||
}
|
||||
|
||||
function isProductSelected() {
|
||||
return !$.isEmptyObject($scope.productInfo);
|
||||
}
|
||||
|
||||
function showQuantityField(category) {
|
||||
return category !== 'installation';
|
||||
}
|
||||
|
||||
function isResetBtnVisible() {
|
||||
return $scope.actionType === 'edit';
|
||||
}
|
||||
|
||||
function isAddVirtualProductsFormVisible() {
|
||||
return addingNewVirtualProduct;
|
||||
}
|
||||
|
||||
function enableAddNewVirtualProducts() {
|
||||
addingNewVirtualProduct = !addingNewVirtualProduct;
|
||||
}
|
||||
|
||||
function getVirtualProductsByCategories(packageTemplateSelected = {}) {
|
||||
if ($scope.actionType === 'create') {
|
||||
$scope.packageSelected = {};
|
||||
} else {
|
||||
if (packageTemplateSelected && Object.keys(packageTemplateSelected).length > 0) {
|
||||
$scope.packageSelected = packageTemplateSelected || {};
|
||||
}
|
||||
}
|
||||
|
||||
httpCall('packages/api/getVirtualProductsByCategories', setProductsByCategories);
|
||||
}
|
||||
|
||||
function setProductsByCategories(response) {
|
||||
$scope.productsByCategories = typeof response.data !== 'undefined' ? response.data : [];
|
||||
|
||||
Object.keys($scope.productsByCategories).forEach(category => {
|
||||
categories.push(category);
|
||||
$scope.packagesByCategories[category] = [];
|
||||
});
|
||||
|
||||
if ($scope.packageSelected && $scope.packageSelected.id) {
|
||||
$scope.packageName = $scope.packageSelected.name || '';
|
||||
$scope.packageDescription = $scope.packageSelected.description || '';
|
||||
$scope.packageSelected.products.forEach(productInfo => {
|
||||
$scope.packagesByCategories[productInfo.category].push(productInfo);
|
||||
$scope.productUnit[productInfo.idProduct] = parseInt(productInfo.productUnit);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function onDragStartFromProducts(event, ui, product, productKey) {
|
||||
$('#' + $scope.actionType + '-package-template-products-list-' + product.category).css({
|
||||
overflow: 'visible'
|
||||
});
|
||||
$('.' + product.category + '-in-package').addClass('allowed-drop-zone');
|
||||
|
||||
droppedInPackage = {
|
||||
key: productKey,
|
||||
value: product
|
||||
};
|
||||
droppedInProducts = {};
|
||||
elementDragged = 'product';
|
||||
}
|
||||
|
||||
function onDragStartFromPackage(event, ui, product, productKey) {
|
||||
$('#' + $scope.actionType + '-packages-template-list-' + product.category).css({
|
||||
overflow: 'visible'
|
||||
});
|
||||
|
||||
droppedInProducts = {
|
||||
key: productKey,
|
||||
value: product
|
||||
};
|
||||
droppedInPackage = {};
|
||||
elementDragged = 'package';
|
||||
}
|
||||
|
||||
function onDragStop(event, ui, product) {
|
||||
$('.package-list-' + product.category).css({
|
||||
'overflow': 'auto'
|
||||
});
|
||||
$('.' + product.category + '-in-package').removeClass('allowed-drop-zone');
|
||||
|
||||
$scope.productUnit[product.idProduct] = $scope.productUnit[product.idProduct] || 1;
|
||||
}
|
||||
|
||||
function productDropped(event, ui, placeToDrop, productCategory) {
|
||||
if (elementDragged !== placeToDrop) {
|
||||
if (!$scope.packagesByCategories[productCategory]) {
|
||||
$scope.packagesByCategories[productCategory] = [];
|
||||
}
|
||||
if (placeToDrop === 'package') {
|
||||
const productExists = $scope.packagesByCategories[productCategory].some(product => {
|
||||
return product.idProduct === droppedInPackage.value.idProduct;
|
||||
});
|
||||
if(productExists) {
|
||||
$scope.productUnit[droppedInPackage.value.idProduct]++;
|
||||
} else {
|
||||
$scope.packagesByCategories[productCategory].push(droppedInPackage.value);
|
||||
}
|
||||
} else if (placeToDrop === 'product') {
|
||||
$scope.packagesByCategories[productCategory].splice(droppedInProducts.key, 1);
|
||||
}
|
||||
}
|
||||
|
||||
$(ui.helper).css({
|
||||
position: 'relative',
|
||||
left: 0,
|
||||
top: 0
|
||||
});
|
||||
elementDragged = '';
|
||||
}
|
||||
|
||||
function updatePackage() {
|
||||
const productsInPackageList = [];
|
||||
let productsPerType;
|
||||
|
||||
for (productsPerType in $scope.packagesByCategories) {
|
||||
$scope.packagesByCategories[productsPerType].forEach(product => {
|
||||
product.productUnit = $scope.productUnit[product.idProduct] || 1;
|
||||
productsInPackageList.push(product);
|
||||
});
|
||||
}
|
||||
|
||||
const packageInfo = {
|
||||
packageName: $scope.packageName || '',
|
||||
packageDescription: $scope.packageDescription || '',
|
||||
idPackage: $scope.packageSelected && $scope.packageSelected.id ? $scope.packageSelected.id : 0,
|
||||
isForEdit: $scope.actionType === 'create' ? false : true
|
||||
};
|
||||
|
||||
const params = {
|
||||
products: JSON.stringify(productsInPackageList),
|
||||
packageInfo: JSON.stringify(packageInfo)
|
||||
};
|
||||
|
||||
if ($scope.actionType === 'create') {
|
||||
httpCall('packages/api/createTemplatePackagesData', showConfirmationMessage, params);
|
||||
} else if ($scope.actionType === 'edit') {
|
||||
httpCall('packages/api/updateInformationDataInPackageTemplate', showConfirmationMessage, params);
|
||||
}
|
||||
}
|
||||
|
||||
function showConfirmationMessage(response) {
|
||||
if (response.data && typeof response.data.messageData !== 'undefined') {
|
||||
const translationDataMessages = {
|
||||
country: $scope.countrySelected.name || '',
|
||||
packageName: $scope.packageName,
|
||||
packageReference: $scope.packageReference,
|
||||
productsNumber: response.data.productsNumber || 0
|
||||
};
|
||||
|
||||
if (response.data.messageData.message === 'PACKAGE_NAME_EXISTS') {
|
||||
$('#packageName').focus();
|
||||
}
|
||||
|
||||
response.data.messageData.forEach(messageObj => {
|
||||
translationDataMessages.field = messageObj.field || '';
|
||||
const message = $translate.instant('packages.forms.messages.' + messageObj.message, translationDataMessages);
|
||||
utilsService.displayMessage(messageObj.code, message);
|
||||
|
||||
if (messageObj.code === 'success') {
|
||||
if ($scope.actionType === 'create') {
|
||||
$scope.packageName = '';
|
||||
$scope.packageReference = '';
|
||||
$scope.packageDescription = '';
|
||||
Object.keys($scope.productUnit).map(idProduct => {
|
||||
$scope.productUnit[idProduct] = 1;
|
||||
});
|
||||
getVirtualProductsByCategories();
|
||||
} else if ($scope.actionType === 'edit') {
|
||||
$scope.packageUpdated = response.data.packageUpdated;
|
||||
packagesUtilsService.getPackageTemplates().then(setPackageAfterEdit, global.onHttpError);
|
||||
}
|
||||
} else {
|
||||
if (response.data.messageData.type && response.data.messageData.limit) {
|
||||
translationDataMessages.type = response.data.messageData.type;
|
||||
translationDataMessages.limit = response.data.messageData.limit;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
const errorMessage = $translate.instant('packages.forms.messages.SERVER_ERROR');
|
||||
utilsService.displayMessage('error', errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
function setPackageAfterEdit(response) {
|
||||
if (response.data) {
|
||||
utilsService.executeRegisteredFunction('setPackagesTemplates', response);
|
||||
$scope.packageSelected = {
|
||||
id: $scope.packageUpdated.idPackage,
|
||||
packageName: $scope.packageUpdated.packageName,
|
||||
packageDescription: $scope.packageUpdated.packageDescription
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function resetProducts() {
|
||||
getVirtualProductsByCategories();
|
||||
const message = $translate.instant('packages.forms.messages.RESET_PACKAGE');
|
||||
utilsService.displayMessage('success', message);
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,373 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.controller('selectPackageCtrl', ['$scope', '$http', '$', '$translate', '$sce', 'utilsService', selectPackageCtrl])
|
||||
.directive('selectPackage', [selectPackageDirective]);
|
||||
|
||||
function selectPackageDirective() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/selectPackage'
|
||||
};
|
||||
}
|
||||
|
||||
function selectPackageCtrl($scope, $http, $, $translate, $sce, utilsService) {
|
||||
$scope.startSelectPackageModule = startSelectPackageModule;
|
||||
$scope.selectCustomer = selectCustomer;
|
||||
$scope.goToNextStep = goToNextStep;
|
||||
$scope.isStepVisible = isStepVisible;
|
||||
$scope.isVisibleToCustomer = isVisibleToCustomer;
|
||||
$scope.setVisible = setVisible;
|
||||
$scope.hasPrevStep = hasPrevStep;
|
||||
$scope.priceSum = priceSum;
|
||||
$scope.isSameCompany = isSameCompany;
|
||||
$scope.actionButton = 'NEXT';
|
||||
$scope.prevButton = '';
|
||||
$scope.customers = [];
|
||||
$scope.packageInfo = {};
|
||||
$scope.packageProducts = [];
|
||||
$scope.selectedCustomers = [];
|
||||
$scope.invoiceProcesses = [];
|
||||
$scope.priceList = {};
|
||||
$scope.title = {};
|
||||
$scope.showTitle = showTitle;
|
||||
$scope.hideTitle = hideTitle;
|
||||
$scope.getCustomerPrices = getCustomerPrices;
|
||||
$scope.data = {};
|
||||
$scope.showHideRemoveDialog = showHideRemoveDialog;
|
||||
$scope.idCustomer = 0;
|
||||
$scope.isRemoveDialogVisible = false;
|
||||
$scope.removeCustomerSpecificCommissions = removeCustomerSpecificCommissions;
|
||||
$scope.renderHtml = renderHtml;
|
||||
$scope.selectionSteps = {
|
||||
'set-default-prices': {
|
||||
current: 'set-default-prices',
|
||||
next: 'select-commissions',
|
||||
prev: '',
|
||||
isActionPromise: true,
|
||||
beforeAction: setDefaultPrices,
|
||||
action: getCustomers
|
||||
},
|
||||
'select-commissions': {
|
||||
current: 'select-commissions',
|
||||
next: '',
|
||||
prev: 'set-default-prices',
|
||||
isActionPromise: false,
|
||||
beforeAction: () => {
|
||||
return true;
|
||||
},
|
||||
action: saveMyPackage
|
||||
},
|
||||
};
|
||||
$scope.step = $scope.selectionSteps['set-default-prices'];
|
||||
|
||||
function startSelectPackageModule() {
|
||||
getPackageInfo();
|
||||
getBrokerPriceList();
|
||||
}
|
||||
|
||||
function showTitle(idPayType) {
|
||||
$scope.title[idPayType] = true;
|
||||
}
|
||||
|
||||
function hideTitle(idPayType) {
|
||||
$scope.title[idPayType] = false;
|
||||
}
|
||||
|
||||
function isSameCompany(customer) {
|
||||
return parseInt(customer.isSameCompanyAsCl) === 1;
|
||||
}
|
||||
|
||||
function isStepVisible(step) {
|
||||
return step === $scope.step.current;
|
||||
}
|
||||
|
||||
function isVisibleToCustomer(customerPayType) {
|
||||
return customerPayType && customerPayType.visibleToCustomer ? 'glyphicon-eye-open' : 'glyphicon-eye-close';
|
||||
}
|
||||
|
||||
function setVisible(customerPayType) {
|
||||
customerPayType.visibleToCustomer = !customerPayType.visibleToCustomer;
|
||||
}
|
||||
|
||||
function getPackageInfo() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getPackageInfo',
|
||||
data: params
|
||||
}).then(showPackageInfo, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showPackageInfo(response) {
|
||||
if (response.data.info && response.data.products) {
|
||||
$scope.packageInfo = response.data.info[0];
|
||||
$scope.packageProducts = response.data.products;
|
||||
}
|
||||
}
|
||||
|
||||
function getCustomers() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getComercialLeadCustomers',
|
||||
data: params
|
||||
}).then(showCustomers, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showCustomers(response) {
|
||||
if (response.data.length > 0) {
|
||||
$scope.selectedCustomers = [];
|
||||
$scope.customers = response.data;
|
||||
response.data.forEach((customer, key) => {
|
||||
if (customer.selectedCustomer !== '0') {
|
||||
selectCustomer(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function setDefaultPrices() {
|
||||
const defaultPrices = [];
|
||||
// 0 is for the default prices. Any other int value is the id of the customer
|
||||
$scope.priceList[0].forEach(priceObj => {
|
||||
defaultPrices.push({
|
||||
idPayType: priceObj.idPayType,
|
||||
defaultExtra: priceObj.defaultExtra,
|
||||
defaultRecurent: priceObj.defaultRecurent,
|
||||
defaultServicesRecurent: priceObj.defaultServicesRecurent,
|
||||
visibleToCustomer: priceObj.visibleToCustomer
|
||||
});
|
||||
});
|
||||
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0,
|
||||
defaultPrices: JSON.stringify(defaultPrices)
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/updateDefaultPrices',
|
||||
data: params
|
||||
}).then(showUpdateDefaultMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showUpdateDefaultMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const key = messageObj.key ? $translate.instant('packages.tables.headers.' + messageObj.key) : '';
|
||||
let translatedMessage = $translate.instant('packages.messages.' + messageObj.message);
|
||||
translatedMessage = key !== '' ? key + ': ' + translatedMessage : translatedMessage;
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
|
||||
if (messageObj.code === 'success' || messageObj.code === 'warning') {
|
||||
goToNextStep('next', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function getComission(customerPrice, defaultValue, isSameCompanyAsCl) {
|
||||
const defaultPrice = parseInt(isSameCompanyAsCl) === 1 ? 0 : defaultValue;
|
||||
|
||||
return parseFloat(customerPrice) || defaultPrice;
|
||||
}
|
||||
|
||||
function getBrokerPriceList(idCustomer = 0) {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0,
|
||||
idCustomer
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getBrokerPriceList',
|
||||
data: params
|
||||
}).then(setPriceList, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function setPriceList(response) {
|
||||
if (typeof response.data.brokerPrices !== 'undefined' && typeof response.data.commercialLeadPrices !== 'undefined') {
|
||||
const brokerPrices = response.data.brokerPrices;
|
||||
const commercialLeadPrices = response.data.commercialLeadPrices;
|
||||
// if 0, the prices are the ones default
|
||||
const idCustomer = response.data.idCustomer;
|
||||
|
||||
brokerPrices[idCustomer].forEach((value) => {
|
||||
value.minimalFixedPrice = parseFloat(value.minimalFixedPrice).toFixed(2);
|
||||
value.minimalRecurentPrice = parseFloat(value.minimalRecurentPrice);
|
||||
value.minimalServicesPrice = parseFloat(value.minimalServicesPrice);
|
||||
value.defaultExtra = parseFloat(value.defaultExtra);
|
||||
value.defaultRecurent = parseFloat(value.defaultRecurent);
|
||||
value.defaultServicesRecurent = parseFloat(value.defaultServicesRecurent);
|
||||
value.visibleToCustomer = (commercialLeadPrices[0] && commercialLeadPrices[0][value.idPayType]) ?
|
||||
parseInt(commercialLeadPrices[0][value.idPayType].visibleToCustomer) :
|
||||
1;
|
||||
$scope.selectedCustomers.forEach(customer => {
|
||||
const clPriceValues = (commercialLeadPrices[customer.id] && commercialLeadPrices[customer.id][value.idPayType]) ? commercialLeadPrices[customer.id][value.idPayType] : {};
|
||||
const fixedCommission = getComission(clPriceValues.fixedExtra, value.defaultExtra, customer.isSameCompanyAsCl);
|
||||
const recurentCommission = getComission(clPriceValues.recurentExtra, value.defaultRecurent, customer.isSameCompanyAsCl);
|
||||
const recurentServicesCommission = getComission(clPriceValues.servicesExtra, value.defaultServicesRecurent, customer.isSameCompanyAsCl);
|
||||
customer.prices = customer.prices || {};
|
||||
customer.prices[value.idPayType] = {
|
||||
visibleToCustomer: parseInt(clPriceValues.visibleToCustomer) || 0,
|
||||
fixedCommission: fixedCommission,
|
||||
recurentCommission: recurentCommission,
|
||||
recurentServicesCommission: recurentServicesCommission,
|
||||
packagePayPeriod: clPriceValues.packagePayPeriod || value.packagePayPeriod
|
||||
};
|
||||
});
|
||||
});
|
||||
$scope.priceList[idCustomer] = brokerPrices[idCustomer];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function selectCustomer(customerKey) {
|
||||
const customerObject = $scope.customers[customerKey];
|
||||
const indexOfCustomer = $scope.selectedCustomers.indexOf(customerObject);
|
||||
|
||||
if (indexOfCustomer >= 0) {
|
||||
$scope.selectedCustomers.splice(indexOfCustomer, 1);
|
||||
} else {
|
||||
$scope.selectedCustomers.push(customerObject);
|
||||
$scope.customers.splice(customerKey, 1);
|
||||
getBrokerPriceList(customerObject.id);
|
||||
}
|
||||
}
|
||||
|
||||
function hasPrevStep() {
|
||||
return $scope.prevButton !== '';
|
||||
}
|
||||
|
||||
function showWarning() {
|
||||
const translatedMessage = $translate.instant('packages.messages.SELECT_CUSTOMERS');
|
||||
utilsService.displayMessage('error', translatedMessage);
|
||||
}
|
||||
|
||||
function goToNextStep(action, promiseFinished) {
|
||||
if ($scope.step.isActionPromise && !promiseFinished) {
|
||||
$scope.step.beforeAction();
|
||||
} else {
|
||||
const beforeACtionSuccesfull = promiseFinished || $scope.step.beforeAction();
|
||||
|
||||
if (action === 'next') {
|
||||
beforeACtionSuccesfull ? $scope.step.action() : showWarning();
|
||||
}
|
||||
|
||||
if ($scope.step[action] !== '' && (beforeACtionSuccesfull || action === 'prev')) {
|
||||
const newClassForActive = action === 'next' ? 'done-step' : 'inactive-step';
|
||||
const removeClassForNew = action === 'next' ? 'inactive-step' : 'done-step';
|
||||
$('.' + $scope.step.current).removeClass('active-step');
|
||||
$('.' + $scope.step.current).addClass(newClassForActive);
|
||||
$('.' + $scope.step[action]).removeClass(removeClassForNew);
|
||||
$('.' + $scope.step[action]).addClass('active-step');
|
||||
$scope.step = $scope.selectionSteps[$scope.step[action]];
|
||||
|
||||
$scope.actionButton = (action === 'next' && $scope.step.next === '') ? 'SAVE' : 'NEXT';
|
||||
$scope.prevButton = (action === 'prev' && $scope.step.prev === '') ? '' : 'PREV';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function saveMyPackage() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0,
|
||||
selectedCustomers: JSON.stringify($scope.selectedCustomers)
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/updateMyPackage',
|
||||
data: params
|
||||
}).then(showUpdateMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showUpdateMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const key = messageObj.key ? $translate.instant('packages.tables.headers.' + messageObj.key) : '';
|
||||
let translatedMessage = $translate.instant('packages.messages.' + messageObj.message);
|
||||
translatedMessage = key !== '' ? key + ': ' + translatedMessage : translatedMessage;
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function isNumber(value) {
|
||||
const reg = new RegExp('^([0-9]*\.[0-9]+|[0-9]+)$');
|
||||
|
||||
return reg.test(value);
|
||||
}
|
||||
|
||||
function priceSum(values) {
|
||||
let total = 0;
|
||||
let isValid = true;
|
||||
values.forEach((val) => {
|
||||
if (!isNumber(val)) {
|
||||
isValid = false;
|
||||
}
|
||||
total += parseFloat(val);
|
||||
});
|
||||
|
||||
return isValid ? total.toFixed(2) : 'invalid number';
|
||||
}
|
||||
|
||||
function showHideRemoveDialog(idCustomer) {
|
||||
if (idCustomer) {
|
||||
$scope.idCustomer = idCustomer;
|
||||
$scope.customerToRemove = $scope.selectedCustomers.find(custObject => {
|
||||
return custObject.id === idCustomer;
|
||||
});
|
||||
}
|
||||
$scope.$evalAsync(() => {
|
||||
$scope.isRemoveDialogVisible = !$scope.isRemoveDialogVisible;
|
||||
});
|
||||
}
|
||||
|
||||
function getCustomerPrices(selectedCustomerKey) {
|
||||
if (selectedCustomerKey) {
|
||||
const idCustomer = $scope.customers[selectedCustomerKey].id;
|
||||
getBrokerPriceList(idCustomer);
|
||||
|
||||
$scope.selectedCustomers.unshift($scope.customers[selectedCustomerKey]);
|
||||
$scope.customers.splice(selectedCustomerKey, 1);
|
||||
}
|
||||
}
|
||||
|
||||
function removeCustomerSpecificCommissions() {
|
||||
if ($scope.idCustomer) {
|
||||
const removeCustObj = $scope.selectedCustomers.find(filterCustomerToRemove);
|
||||
const removeCustKey = $scope.selectedCustomers.findIndex(filterCustomerToRemove);
|
||||
|
||||
$scope.selectedCustomers.splice(removeCustKey, 1);
|
||||
$scope.customers.push(removeCustObj);
|
||||
|
||||
$scope.customers.sort((customerObject1, customerObject2) => {
|
||||
var x = customerObject1.customer.toLowerCase();
|
||||
var y = customerObject2.customer.toLowerCase();
|
||||
if (x < y) {
|
||||
return -1;
|
||||
}
|
||||
if (x > y) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function filterCustomerToRemove(custObject) {
|
||||
return custObject.id === $scope.idCustomer;
|
||||
}
|
||||
|
||||
function renderHtml(htmlCode) {
|
||||
return $sce.trustAsHtml(htmlCode);
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,242 @@
|
||||
(function () {
|
||||
global.dashModule
|
||||
.controller('setPackagePriceCtrl', ['$scope', '$http', '$', '$translate', '$sce', 'finanncingService', 'utilsService', setPackagePriceCtrl])
|
||||
.directive('setPackagePrice', [setPackagePrice]);
|
||||
|
||||
function setPackagePrice() {
|
||||
return {
|
||||
restrict: 'E',
|
||||
templateUrl: 'packages/html/setPackagePrice'
|
||||
};
|
||||
}
|
||||
|
||||
function setPackagePriceCtrl($scope, $http, $, $translate, $sce, finanncingService, utilsService) {
|
||||
$scope.startSetPackagesPrices = startSetPackagesPrices;
|
||||
$scope.updateCommission = updateCommission;
|
||||
$scope.updateBrokerPricesAndCommission = updateBrokerPricesAndCommission;
|
||||
$scope.calculateTotalPrice = calculateTotalPrice;
|
||||
$scope.isPriceRecurring = isPriceRecurring;
|
||||
$scope.boundMessage = boundMessage;
|
||||
$scope.addPayType = addPayType;
|
||||
$scope.selectPayTypes = selectPayTypes;
|
||||
$scope.removePayType = removePayType;
|
||||
$scope.maxMarginExceded = maxMarginExceded;
|
||||
$scope.renderHtml = renderHtml;
|
||||
$scope.payTypesVisible = false;
|
||||
$scope.interestRate = 0;
|
||||
$scope.prices = [];
|
||||
$scope.selectedPrices = [];
|
||||
$scope.productsPrices = [];
|
||||
$scope.commissionSplit = {};
|
||||
$scope.packageProducts = [];
|
||||
$scope.calculateFinancing = finanncingService.calculateFinancing;
|
||||
$scope.setRecurrentPrice = setRecurrentPrice;
|
||||
$scope.calculateTotalCost = calculateTotalCost;
|
||||
|
||||
function startSetPackagesPrices() {
|
||||
getPackageInfo();
|
||||
getPriceTypes();
|
||||
}
|
||||
|
||||
function getPackageInfo() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getPackageInfo',
|
||||
data: params
|
||||
}).then(showPackageInfo, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showPackageInfo(response) {
|
||||
if (response.data.info && response.data.products) {
|
||||
$scope.packageInfo = response.data.info[0];
|
||||
$scope.packageProducts = response.data.products;
|
||||
}
|
||||
}
|
||||
|
||||
function renderHtml(htmlCode) {
|
||||
return $sce.trustAsHtml(htmlCode);
|
||||
}
|
||||
|
||||
function getPriceTypes() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/getPriceTypes',
|
||||
data: params
|
||||
}).then(showPriceTypes, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showPriceTypes(response) {
|
||||
if (typeof response.data.priceTypes !== 'undefined' && typeof response.data.productsPrices !== 'undefined') {
|
||||
const prodPrices = response.data.productsPrices;
|
||||
const commissionSplit = response.data.commissionSplit ? response.data.commissionSplit : null;
|
||||
$scope.totalPrices = {};
|
||||
$scope.totalPrice = 0;
|
||||
|
||||
$.each(prodPrices, (key, price) => {
|
||||
if(key === 'service') {
|
||||
if(!(key in $scope.totalPrices)) {
|
||||
$scope.totalPrices[key] = {};
|
||||
}
|
||||
$scope.totalPrices[key]['recurringPrice'] = price.recurringPrice;
|
||||
$scope.totalPrices[key]['fixedPrice'] = price.fixedPrice;
|
||||
} else {
|
||||
$scope.totalPrices[key] = price.totalUnitCost;
|
||||
$scope.totalPrice += price.totalUnitCost;
|
||||
}
|
||||
});
|
||||
|
||||
$scope.productsPrices = prodPrices;
|
||||
$scope.selectedPrices = [];
|
||||
|
||||
response.data.priceTypes.forEach(price => {
|
||||
price.minimalFixedPrice = price.minimalFixedPrice ? parseFloat(price.minimalFixedPrice) : 0;
|
||||
price.principalAmount = price.principalAmount ? parseFloat(price.principalAmount) : 0;
|
||||
price.minimalServicesPrice = price.minimalServicesPrice ? parseFloat(price.minimalServicesPrice) : 0;
|
||||
|
||||
price.packagePayPeriod > 0 ? setRecurrentPrice(response.data.interestRate / 100, price) : price.minimalRecurentPrice = 0;
|
||||
|
||||
if (price.minimalFixedPrice || price.minimalRecurentPrice || price.minimalServicesPrice) {
|
||||
price.isChecked = true;
|
||||
$scope.selectedPrices.push(price);
|
||||
} else {
|
||||
price.isChecked = false;
|
||||
}
|
||||
});
|
||||
|
||||
$scope.prices = response.data.priceTypes;
|
||||
$scope.payTypesVisible = $scope.selectedPrices.length === 0;
|
||||
|
||||
$scope.commissionSplit.broker = commissionSplit ? parseFloat(commissionSplit.broker) : 50;
|
||||
$scope.commissionSplit.commercialLead = commissionSplit ? parseFloat(commissionSplit.commercialLead) : 50;
|
||||
$scope.commissionSplit.payMargin = commissionSplit ? parseFloat(commissionSplit.payMargin) : 0;
|
||||
|
||||
$scope.interestRate = response.data.interestRate;
|
||||
}
|
||||
}
|
||||
|
||||
function updateCommission(userType) {
|
||||
if (userType === 'broker') {
|
||||
$scope.commissionSplit.commercialLead = 100 - $scope.commissionSplit.broker;
|
||||
} else {
|
||||
$scope.commissionSplit.broker = 100 - $scope.commissionSplit.commercialLead;
|
||||
}
|
||||
}
|
||||
|
||||
function updateBrokerPricesAndCommission() {
|
||||
const params = $.param({
|
||||
idPackage: global.getParameterByName('idPackage') || 0,
|
||||
prices: JSON.stringify($scope.selectedPrices),
|
||||
commissionSplit: JSON.stringify($scope.commissionSplit)
|
||||
});
|
||||
|
||||
$http({
|
||||
method: 'POST',
|
||||
url: 'packages/api/updateBrokerPricesAndCommission',
|
||||
data: params
|
||||
}).then(showUpdateMessage, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function showUpdateMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const key = messageObj.key ? $translate.instant('packages.tables.headers.' + messageObj.key) : '';
|
||||
let translatedMessage = $translate.instant('packages.messages.' + messageObj.message);
|
||||
translatedMessage = key !== '' ? key + ': ' + translatedMessage : translatedMessage;
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
if (messageObj.code === 'success') {
|
||||
getPriceTypes();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function calculateTotalPrice(unitCost, payPeriod, isPriceRecurring, quantity = 1) {
|
||||
const totalCost = isPriceRecurring === '1' ? unitCost * payPeriod * quantity : unitCost * quantity;
|
||||
|
||||
return totalCost.toFixed(2);
|
||||
}
|
||||
|
||||
function isPriceRecurring(recurring) {
|
||||
return parseInt(recurring) === 1;
|
||||
}
|
||||
|
||||
function boundMessage(packagePayPeriod, periodUnit, type) {
|
||||
return (type === 'servicesContractPeriod' && parseInt(packagePayPeriod) === 0) ?
|
||||
'Unbound' :
|
||||
packagePayPeriod + ' ' + periodUnit;
|
||||
}
|
||||
|
||||
function addPayType() {
|
||||
$scope.payTypesVisible = true;
|
||||
}
|
||||
|
||||
function selectPayTypes() {
|
||||
$scope.prices.forEach((price) => {
|
||||
const indexOfElement = $scope.selectedPrices.indexOf(price);
|
||||
if (price.isChecked && indexOfElement === -1) {
|
||||
$scope.selectedPrices.push(price);
|
||||
}
|
||||
|
||||
if (!price.isChecked && indexOfElement !== -1) {
|
||||
$scope.selectedPrices.splice(indexOfElement, 1);
|
||||
}
|
||||
});
|
||||
$scope.selectedPrices.sort((a, b) => {
|
||||
return a.idPayType > b.idPayType;
|
||||
});
|
||||
|
||||
if ($scope.selectedPrices.length === 0) {
|
||||
const translatedMessage = $translate.instant('packages.messages.NO_PRICE_TYPE_SELECTED');
|
||||
utilsService.displayMessage('warning', translatedMessage);
|
||||
} else {
|
||||
$scope.payTypesVisible = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function removePayType(key) {
|
||||
$scope.selectedPrices[key].isChecked = false;
|
||||
$scope.selectedPrices.splice(key, 1);
|
||||
$scope.payTypesVisible = $scope.selectedPrices.length === 0;
|
||||
}
|
||||
|
||||
function maxMarginExceded(margin, totalCost) {
|
||||
return margin !== 0 && totalCost > margin;
|
||||
}
|
||||
|
||||
|
||||
function setRecurrentPrice(interestRate, price){
|
||||
price.minimalRecurentPrice = parseFloat(finanncingService.calculateFinancing(interestRate, price.packagePayPeriod, price.principalAmount));
|
||||
}
|
||||
|
||||
function calculateTotalCost(totalPrices, type) {
|
||||
if(totalPrices) {
|
||||
let totalPrice = 0;
|
||||
if(type === 'fixed') {
|
||||
if(totalPrices.product) {
|
||||
totalPrice += totalPrices.product || 0;
|
||||
}
|
||||
if(totalPrices.installation) {
|
||||
totalPrice += totalPrices.installation || 0;
|
||||
}
|
||||
if(totalPrices.service) {
|
||||
totalPrice += totalPrices.service.fixedPrice || 0;
|
||||
}
|
||||
return totalPrice;
|
||||
}
|
||||
|
||||
return totalPrices && totalPrices.service ? totalPrices.service.recurringPrice : 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -0,0 +1,64 @@
|
||||
(function() {
|
||||
global.dashModule.directive('uploadImageCdn', uploadImageCdnDirective);
|
||||
|
||||
function uploadImageCdnDirective() {
|
||||
return {
|
||||
restrict: 'EA',
|
||||
scope: {
|
||||
uploadParams: '@'
|
||||
},
|
||||
controller: uploadImageCdnCtrl,
|
||||
templateUrl: 'packages/html/uploadImageCdnTemplate'
|
||||
};
|
||||
}
|
||||
|
||||
function uploadImageCdnCtrl($scope, $, $http, $translate, utilsService, Upload) {
|
||||
$scope.uploadImage = uploadImage;
|
||||
$scope.options = {};
|
||||
$scope.parseUploadParams = parseUploadParams;
|
||||
|
||||
|
||||
function parseUploadParams() {
|
||||
$scope.uploadParams = JSON.parse($scope.uploadParams);
|
||||
$scope.showUseProfilePictureBox = 'shouldShowBox' in $scope.uploadParams ? $scope.uploadParams.shouldShowBox : true;
|
||||
}
|
||||
|
||||
function uploadImage(file) {
|
||||
if(typeof $scope.uploadParams === 'string') {
|
||||
$scope.uploadParams = JSON.parse($scope.uploadParams);
|
||||
}
|
||||
$scope.options.idPackage = $scope.uploadParams.idPackage || 0;
|
||||
$scope.options.folder = $scope.uploadParams.idCountry || 0;
|
||||
|
||||
Upload.upload({
|
||||
url: 'packages/api/uploadNewImage',
|
||||
method: 'POST',
|
||||
file,
|
||||
data: {
|
||||
options: $scope.options
|
||||
}
|
||||
}).then(getUploadedImageUrl, utilsService.onHttpError);
|
||||
}
|
||||
|
||||
function getUploadedImageUrl(response) {
|
||||
if (typeof response.data.imageUrl !== 'undefined') {
|
||||
$scope.imageUrl = response.data.imageUrl;
|
||||
}
|
||||
displayUpdateMessage(response);
|
||||
}
|
||||
|
||||
function displayUpdateMessage(response) {
|
||||
if (typeof response.data.messages !== 'undefined') {
|
||||
response.data.messages.forEach((messageObj) => {
|
||||
const translatedMessage = $translate.instant('packages.forms.messages.' + messageObj.message);
|
||||
utilsService.displayMessage(messageObj.code, translatedMessage);
|
||||
|
||||
if(messageObj.code === 'success') {
|
||||
$scope.options = {};
|
||||
utilsService.executeRegisteredFunction('getImagesFromCdn');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user