Files
old-wiaas-legacy/api-wiaas/client/js/components/orders/set-delivery-dates.directive.js
2018-06-11 11:09:35 +02:00

304 lines
12 KiB
JavaScript

(function () {
global.dashModule
.controller('setDeliveryDatesCtrl', ['$scope', '$', '$http', '$translate', 'utilsService', 'ordersUtilsService', setDeliveryDatesCtrl])
.directive('setDeliveryDates', [setDeliveryDatesDirective]);
function setDeliveryDatesDirective() {
return {
restrict: 'E'
};
}
function setDeliveryDatesCtrl($scope, $, $http, $translate, utilsService, ordersUtilsService) {
let areEstimatedDatesSet = false;
let areConfirmedDatesSet = false;
const stepIdsForDeliveryDates = {
firstStepEnabled: 5,
lastStepEnabled: 6
};
$scope.isDatePickerOpen = {
estimatedDate: {},
confirmedDate: {}
};
const idOrder = global.getParameterByName('idOrder');
const process = $scope.$parent.process;
const idPackage = process.idPackage;
const idProcess = process.idProcess;
const stepInfo = {
idOrder,
idPackage,
idProcess
};
$scope.idPackage = idPackage;
$scope.getEstimationsAndEarliestInstallDate = getEstimationsAndEarliestInstallDate;
$scope.updateSupplierEstimation = updateSupplierEstimation;
$scope.getEstimationIcon = getEstimationIcon;
$scope.getEstimatedOrConfirmedMaxDate = getEstimatedOrConfirmedMaxDate;
$scope.updateTracking = updateTracking;
$scope.addTracking = addTracking;
$scope.supplierEstimations = [];
$scope.shouldShowAddNewTracking = shouldShowAddNewTracking;
$scope.showAddNewTracking = {};
$scope.removeTracking = removeTracking;
$scope.isRemoveDialogVisible = {};
$scope.showHideRemoveDialog = showHideRemoveDialog;
$scope.isTrackingEmpty = isTrackingEmpty;
$scope.removeSupplierEstimation = removeSupplierEstimation;
$scope.areProductsInOrder = true;
$scope.openDatePicker = openDatePicker;
$scope.isDateEditable = isDateEditable;
$scope.isRemoveDatesDialogVisible = {
'estimated': {},
'confirmed': {}
};
$scope.showHideRemoveDatesDialog = showHideRemoveDatesDialog;
$scope.earliestInstallationDate = () => {
return ordersUtilsService.getEarliestInstallationDate(idOrder);
};
$scope.isSetDeliveryDatesDisabled = () => {
return ordersUtilsService.isComponentDisabled(idOrder, 'setDeliveryDates');
};
function getEstimationsAndEarliestInstallDate() {
getSupplierEstimations();
ordersUtilsService.checkIfIsNextStepWanted(idOrder, 'setDeliveryDates', stepIdsForDeliveryDates);
ordersUtilsService.getEarliestInstallationDateFromDb(idOrder, idPackage);
utilsService.registerFunction('getSupplierEstimations', getSupplierEstimations);
}
function getSupplierEstimations(onInit = false) {
const params = $.param({
idOrder
});
$http({
method: 'POST',
data: params,
url: 'orders/api/getSupplierEstimations'
}).then((response) => {
setSuppliersEstimations(response, onInit);
}, utilsService.onHttpError);
}
function setSuppliersEstimations(response, onInit = false) {
areEstimatedDatesSet = false;
areConfirmedDatesSet = false;
if (response.data) {
$scope.supplierEstimations = response.data;
if ($scope.supplierEstimations.length === 0) {
$scope.areProductsInOrder = false;
}
$scope.supplierEstimations.forEach(supplierEstimation => {
$scope.showAddNewTracking[supplierEstimation.idSupplier] = !supplierEstimation.trackings.length;
});
}
if (!onInit) {
areEstimatedDatesSet = checkEstimatedDateSet($scope.supplierEstimations);
areConfirmedDatesSet = checkConfirmedDateSet($scope.supplierEstimations);
if (areConfirmedDatesSet) {
const maxConfDate = getEstimatedOrConfirmedMaxDate('confirmedDate');
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, maxConfDate);
} else if (areEstimatedDatesSet) {
const maxEstimatedDate = getEstimatedOrConfirmedMaxDate('estimatedDate');
const maxConfDate = getEstimatedOrConfirmedMaxDate('confirmedDate');
const maxDate = maxConfDate !== '-' ? maxConfDate > maxEstimatedDate ? maxConfDate : maxEstimatedDate : maxEstimatedDate;
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, maxDate);
}
}
utilsService.executeRegisteredFunction('isNextBtnDisabled', stepInfo);
}
function checkEstimatedDateSet(supplierEstimations) {
return supplierEstimations.every(supplierEstimation => {
return supplierEstimation.estimatedDate !== null;
});
}
function checkConfirmedDateSet(supplierEstimations) {
return supplierEstimations.every(supplierEstimation => {
return supplierEstimation.confirmedDate !== null;
});
}
function addTracking(idSupplier, trackingNumber, trackingUrl) {
const params = $.param({
idOrder,
idSupplier,
trackingNumber,
trackingUrl
});
$http({
method: 'POST',
data: params,
url: 'orders/api/addTracking'
}).then(displayUpdateMessage, utilsService.onHttpError);
}
function updateTracking(trackingInfo) {
const params = $.param({
idTracking: trackingInfo.idTracking,
trackingNumber: trackingInfo.trackingNumber,
trackingUrl: trackingInfo.trackingUrl
});
$http({
method: 'POST',
data: params,
url: 'orders/api/updateTracking'
}).then(displayUpdateMessage, utilsService.onHttpError);
}
function removeSupplierEstimation(fctParams) {
const params = $.param({
idOrder,
type: fctParams.type,
idSupplier: fctParams.idSupplier
});
if(areEstimatedDatesSet) {
if(!areConfirmedDatesSet && fctParams.type === 'estimation') {
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, 'remove');
}
} else if(!areEstimatedDatesSet && areConfirmedDatesSet){
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, 'remove');
} else if(areEstimatedDatesSet || areConfirmedDatesSet) {
const maxEstimatedDate = getEstimatedOrConfirmedMaxDate('estimatedDate');
const maxConfDate = getEstimatedOrConfirmedMaxDate('confirmedDate');
const maxDate = maxConfDate !== '-' ? maxConfDate > maxEstimatedDate ? maxConfDate : maxEstimatedDate : maxEstimatedDate;
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, maxDate);
}
$http({
method: 'POST',
data: params,
url: 'orders/api/removeSupplierEstimation'
}).then(displayUpdateMessage, utilsService.onHttpError);
}
function updateSupplierEstimation(date, supplierEstimation) {
if (Date.parse(date)) {
const params = $.param({
idOrder,
idSupplier: supplierEstimation.idSupplier,
estimatedDate: supplierEstimation.estimatedDate,
confirmedDate: supplierEstimation.confirmedDate
});
if (supplierEstimation.confirmedDate && areEstimatedDatesSet) {
const maxEstimatedDate = getEstimatedOrConfirmedMaxDate('estimatedDate');
const maxConfDate = getEstimatedOrConfirmedMaxDate('confirmedDate');
let maxDate = maxEstimatedDate;
if(maxConfDate !== '-') {
if(maxConfDate > maxEstimatedDate) {
maxDate = maxConfDate;
}
}
ordersUtilsService.setMaximumDeliveryDate(idOrder, 0, maxDate);
}
$http({
method: 'POST',
data: params,
url: 'orders/api/updateSupplierEstimation'
}).then(displayUpdateMessage, utilsService.onHttpError);
} else {
const translatedMessage = $translate.instant('orders.messages.WRONG_DATE_FORMAT');
utilsService.displayMessage('error', translatedMessage);
}
}
function displayUpdateMessage(response) {
if (typeof response.data.messages !== 'undefined') {
response.data.messages.forEach((messageObj) => {
const translatedMessage = $translate.instant('orders.messages.' + messageObj.message);
const messageKey = 'key' in messageObj ? messageObj.key : '';
utilsService.displayMessage(messageObj.code, translatedMessage + messageKey);
if (response.data.messages[0].code === 'success') {
getSupplierEstimations();
if ('idProduct' in response.data) {
$scope.isDatePickerOpen['estimatedDate'][response.data.idProduct] = false;
$scope.isDatePickerOpen['confirmedDate'][response.data.idProduct] = false;
}
}
});
}
}
function getEstimationIcon(confirmedDate) {
return confirmedDate ? 'glyphicon-ok' : 'glyphicon-time';
}
function getEstimatedOrConfirmedMaxDate(key) {
let maxDate = '2000-01-01';
let d1;
let d2;
const maxTempDate = $scope.supplierEstimations.length > 0 ?
$scope.supplierEstimations.reduce((a, b) => {
d1 = new Date(a[key]);
d2 = new Date(b[key]);
return d1 < d2 ? b : a;
}) : maxDate;
d1 = new Date(maxTempDate[key]);
d2 = new Date(maxDate);
maxDate = d1 > d2 ? maxTempDate[key] : maxDate;
return maxDate !== '2000-01-01' ? maxDate : '-';
}
function shouldShowAddNewTracking(idSupplier) {
$scope.$evalAsync(() => {
$scope.showAddNewTracking[idSupplier] = !$scope.showAddNewTracking[idSupplier];
});
}
function showHideRemoveDialog(idTracking) {
$scope.$evalAsync(() => {
$scope.isRemoveDialogVisible[idTracking] = !$scope.isRemoveDialogVisible[idTracking];
});
}
function removeTracking(trackingInfo) {
const params = $.param({
idTracking: trackingInfo.idTracking
});
$http({
method: 'POST',
url: 'orders/api/removeTracking',
data: params
}).then(displayUpdateMessage, utilsService.onHttpError);
}
function isTrackingEmpty(trackingData) {
return trackingData.length === 0;
}
function openDatePicker(dateType, idSupplier) {
if (!(idSupplier in $scope.isDatePickerOpen[dateType])) {
$scope.isDatePickerOpen[dateType][idSupplier] = false;
}
$scope.isDatePickerOpen[dateType][idSupplier] = !$scope.isDatePickerOpen[dateType][idSupplier];
}
function isDateEditable(dateType, supplierEstimation) {
return $scope.isDatePickerOpen[dateType][supplierEstimation.idSupplier] || !supplierEstimation[dateType];
}
function showHideRemoveDatesDialog(type, supplierEstimation) {
$scope.$evalAsync(() => {
$scope.isRemoveDatesDialogVisible[type][supplierEstimation.idSupplier] = !$scope.isRemoveDatesDialogVisible[type][supplierEstimation.idSupplier];
});
}
}
})();