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

243 lines
9.7 KiB
JavaScript

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