374 lines
15 KiB
JavaScript
374 lines
15 KiB
JavaScript
(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);
|
|
}
|
|
}
|
|
})();
|