Initial commit

This commit is contained in:
Senad Uka
2018-06-11 11:09:35 +02:00
commit ed7df7b11f
1954 changed files with 483354 additions and 0 deletions

View File

@@ -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');
}
});
}
}
}
})();

View File

@@ -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;
});
}
}
})();

View File

@@ -0,0 +1,9 @@
global.dashModule
.directive('createPackagesTemplate', createPackagesTemplateDirective);
function createPackagesTemplateDirective() {
return {
restrict: 'E',
templateUrl: 'packages/html/createTemplatePackagesTemplate'
};
}

View File

@@ -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 : '';
}
}

View File

@@ -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);
});
}
}
}
})();

View File

@@ -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);
}
}
})();

View File

@@ -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 : '';
}
}
})();

View File

@@ -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(',');
}
}
}
})();

View File

@@ -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';
}
}
})();

View File

@@ -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(',');
}
}
}
})();

View File

@@ -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'
});
}
}
})();

View 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;
}
}
}
})();

File diff suppressed because it is too large Load Diff

View File

@@ -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'
: '';
}
}
})();

View File

@@ -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);
}
}
})();

View File

@@ -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);
}
}
})();

View File

@@ -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;
}
}
})();

View File

@@ -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');
}
});
}
}
}
})();