EnVisageOnline/Main/Source/EnVisage/Scripts/Angular/Controllers/scenarioHeaderController.js

301 lines
12 KiB
JavaScript

'use strict';
app.controller('scenarioHeaderController', ['$scope', '$http', function ($scope, $http) {
var commonErrorMessage = 'An error occurred while processing your request. Please, try again later.';
$scope.$on('costSavingChanged', function (event, data) {
$scope.changedData.costSaving = data;
$scope.modelChanged();
});
$scope.$on('gridChanged', function () {
$scope.gridChanged();
});
$scope.changedData = {
parentId: null,
name: null,
startDate: null,
endDate: null,
growthScenario: null,
expense: null,
revenue: null,
oldRevenue: null,
useLMMargin: null,
grossMargin: null,
oldGrossMargin: null,
lmMargin: null,
oldLMMargin: null,
templateId: null,
oldTemplateId: null,
isActiveScenario: null,
isBottomUp: null,
duration: null,
dateForStartOfChanges: null,
activeTab: null,
costSaving: null,
isFinInfoEditable: false,
needToAdjustMargin: true,
projectHasDependencies: false,
startDateConstraint: null,
endDateConstraint: null,
UserDefinedFields: [],
workflowScheme: null,
adjustMarginRased: null,
dateForStartOfChangesOld: null
};
$scope.HeaderIsChanged = false;
$scope.IsChanged = false;
$scope.DateConstraintsWarningVisible = false;
$scope.init = function (initData) {
if (!initData)
return;
$scope.changedData.id = initData.id;
$scope.changedData.name = initData.name;
$scope.changedData.parentId = initData.parentId;
$scope.changedData.templateId = initData.templateId;
$scope.changedData.oldTemplateId = initData.templateId;
$scope.changedData.startDate = initData.startDate;
$scope.changedData.endDate = initData.endDate;
$scope.changedData.growthScenario = initData.growthScenario;
$scope.changedData.expense = initData.expense;
$scope.changedData.oldExpense = initData.expense;
$scope.changedData.revenue = initData.revenue;
$scope.changedData.oldRevenue = initData.revenue;
$scope.changedData.useLMMargin = initData.useLMMargin;
$scope.changedData.grossMargin = initData.grossMargin;
$scope.changedData.oldGrossMargin = initData.grossMargin;
$scope.changedData.lmMargin = initData.lmMargin;
$scope.changedData.oldLMMargin = initData.lmMargin;
$scope.changedData.isActiveScenario = initData.isActiveScenario;
$scope.changedData.isBottomUp = initData.isBottomUp;
$scope.changedData.duration = initData.duration;
$scope.changedData.dateForStartOfChanges = initData.dateForStartOfChanges;
$scope.changedData.activeTab = initData.activeTab;
$scope.changedData.isFinInfoEditable = initData.isEditable;
$scope.changedData.projectHasDependencies = initData.projectHasDependencies;
$scope.changedData.startDateConstraint = initData.startDateConstraint;
$scope.changedData.endDateConstraint = initData.endDateConstraint;
$scope.changedData.UserDefinedFields = initData.UserDefinedFields;
$scope.changedData.workflowScheme = initData.workflowScheme;
$scope.changedData.dateForStartOfChangesOld = initData.dateForStartOfChanges;
if ($scope.changedData.dateForStartOfChangesOld != undefined && $scope.changedData.dateForStartOfChangesOld != null)
$scope.changedData.dateForStartOfChangesOld =
DateTimeConverter.stringToMs($scope.changedData.dateForStartOfChangesOld);
};
$scope.recalculateCalendar = function () {
var valid = !(isValid && typeof isValid == 'function') || isValid();
if (valid) {
$scope.HeaderIsChanged = true;
var data = {
id: $scope.changedData.id,
name: $scope.changedData.name,
parentId: $scope.changedData.parentId,
oldTemplateId: $scope.changedData.oldTemplateId,
templateId: $scope.changedData.templateId,
startDate: $scope.changedData.startDate,
endDate: $scope.changedData.endDate,
growthScenario: $scope.changedData.growthScenario,
revenue: $scope.changedData.revenue,
expense: $scope.changedData.expense,
useLMMargin: $scope.changedData.useLMMargin,
grossMargin: $scope.changedData.grossMargin,
lmMargin: $scope.changedData.lmMargin,
isActiveScenario: $scope.changedData.isActiveScenario,
costSaving: $scope.changedData.costSaving,
needToAdjustMargin: $scope.changedData.isFinInfoEditable && $scope.changedData.needToAdjustMargin,
dateForStartOfChanges: $scope.changedData.dateForStartOfChanges,
UserDefinedFields: $scope.changedData.UserDefinedFields,
adjustMarginRased: $scope.changedData.adjustMarginRased,
dateForStartOfChangesOld: $scope.changedData.dateForStartOfChangesOld
};
if ($scope.changedData.adjustMarginRased == null) {
$scope.changedData.adjustMarginRased = data.needToAdjustMargin;
data.adjustMarginRased = data.needToAdjustMargin;
}
$scope.$broadcast('refreshScenarioDetails', data);
$('#uidemo-tabs-default-demo li a:eq(1)').tab('show');
}
};
$scope.saveFinInfo = function () {
var valid = typeof isValidFinInfoForm === "undefined" || !angular.isFunction(isValidFinInfoForm) || isValidFinInfoForm();
if (valid) {
var finInfo = {
expense: $scope.changedData.expense,
revenue: $scope.changedData.revenue,
useLMMargin: $scope.changedData.useLMMargin,
grossMargin: $scope.changedData.grossMargin,
lmMargin: $scope.changedData.lmMargin,
costSaving: $scope.changedData.costSaving,
dateForStartOfChanges: $scope.changedData.dateForStartOfChanges,
needToAdjustMargin: $scope.changedData.needToAdjustMargin
};
$scope.HeaderIsChanged = true;
$scope.$broadcast('refreshFinancialInformation', finInfo);
}
};
$scope.modelChanged = function () {
$scope.IsChanged = true;
};
$scope.gridChanged = function () {
$scope.HeaderIsChanged = true;
$scope.IsChanged = true;
$scope.changedData.activeTab = 'scenarios';
};
$scope.canAdjustFinancial = function () {
return !$scope.IsChanged && !$scope.changedData.isFinInfoEditable;
};
$scope.adjustFinancial = function () {
$scope.changedData.isFinInfoEditable = true;
$scope.$broadcast('adjustFinancial', true);
};
$scope.isFinInfoEditable = function () {
return $scope.changedData.isFinInfoEditable;
};
$scope.$watch("changedData.startDate", function (newValue, oldValue) {
if (newValue != oldValue) {
var data = {
startDate: newValue,
endDate: $scope.changedData.endDate
};
refreshDuration();
checkDateConstraints();
$scope.$broadcast('scenarioRangeChanged', data);
}
});
$scope.$watch("changedData.endDate", function (newValue, oldValue) {
if (newValue != oldValue) {
var data = {
startDate: $scope.changedData.startDate,
endDate: newValue
};
refreshDuration();
checkDateConstraints();
$scope.$broadcast('scenarioRangeChanged', data);
}
});
$scope.$watch("changedData.workflowScheme", function (newValue, oldValue) {
if (newValue != oldValue) {
var data = {
WorkFlowSchema: $scope.changedData.workflowScheme
};
$scope.$broadcast('scenarioWorkFlowSchemaChanged', data);
}
});
$scope.getTabClass = function (tabName) {
if (tabName == 'general') {
if (!$scope.changedData.activeTab || $scope.changedData.activeTab.replace(' ', '').length <= 0)
return 'active';
if ($scope.IsChanged && ($scope.changedData.activeTab == 'rateTable' || $scope.changedData.activeTab == 'notes'))
return 'active';
}
if (tabName == 'rateTable' || tabName == 'notes') {
if ($scope.IsChanged)
return '';
}
return tabName === $scope.changedData.activeTab ? 'active' : '';
};
$scope.scenarioStatusChanged = function (newStatus) {
$scope.$apply(function () {
checkDateConstraints();
});
};
$scope.projectedRevenueChanged = function (value) {
$scope.modelChanged();
if ($scope.changedData.useLMMargin)
calcTDCost(value, $scope.changedData.lmMargin);
else
calcTDCost(value, $scope.changedData.grossMargin);
};
$scope.marginChanged = function (value) {
$scope.modelChanged();
calcTDCost($scope.changedData.revenue, value);
};
$scope.GetUserDefinedFieldValue = function (id) {
var len = $scope.changedData.UserDefinedFields.length;
for (var i = 0; i<len;i++){
var udf = $scope.changedData.UserDefinedFields[i];
if (udf)
if (udf.Id == id)
return udf.Values;
}
}
$scope.UdfChanged = function (id) {
//$.each($scope.changedData.UserDefinedFields, function (i, udf) {
// if (udf.Id == id && udf.Values) {
// udf.Values.value = $scope.changedData.UDF;
// }
//});
$scope.modelChanged();
}
$scope.marginTypeChanged = function (useLMMargin) {
$scope.modelChanged();
if (useLMMargin)
calcTDCost($scope.changedData.revenue, $scope.changedData.lmMargin);
else
calcTDCost($scope.changedData.revenue, $scope.changedData.grossMargin);
};
function calcTDCost(revenue, margin) {
if (!revenue || !margin) {
$scope.changedData.expense = 0;
return;
}
if (margin < 0)
margin = 0;
$scope.changedData.expense = Math.round(revenue * (1 - margin / 100) * 100) / 100;
};
function refreshDuration() {
$scope.modelChanged();
try {
$http.post('/Scenarios/CalculateScenarioDuration', {
startDate: $scope.changedData.startDate,
endDate: $scope.changedData.endDate
}).success(function (data) {
$scope.changedData.duration = data;
});
}
catch (e) {
showErrorModal('Oops!', commonErrorMessage);
return;
}
};
function checkDateConstraints() {
if (!$scope.changedData.projectHasDependencies)
return;
var startDateVioldated = false;
var endDateVioldated = false;
if ($scope.changedData.startDate && $scope.changedData.startDateConstraint) {
var startDateMs = DateTimeConverter.stringToMs($scope.changedData.startDate);
startDateVioldated = startDateMs < $scope.changedData.startDateConstraint;
}
if ($scope.changedData.endDate && $scope.changedData.endDateConstraint) {
var endDateMs = DateTimeConverter.stringToMs($scope.changedData.endDate);
endDateVioldated = endDateMs > $scope.changedData.endDateConstraint;
}
$scope.DateConstraintsWarningVisible = $scope.changedData.isActiveScenario && (startDateVioldated || endDateVioldated);
};
}]);