164 lines
5.5 KiB
JavaScript
164 lines
5.5 KiB
JavaScript
export var PrevisionnelCtrl = function ($scope, $http, $timeout) {
|
|
|
|
$scope.config = {
|
|
initialLoadingDone : false,
|
|
loading : false,
|
|
lines : 24,
|
|
debounceTime : 300, // miliseconds to wait before updating model and saving changes
|
|
/**
|
|
* expenses kind of the user
|
|
*/
|
|
disponibility : 5000,
|
|
averageMonthlyEarnings: 600,
|
|
warningThershold : 2000,
|
|
showDelays : false,
|
|
showRepeats : false,
|
|
monthsBeforeNoMoney : null,
|
|
};
|
|
|
|
let exampleExpenses = [
|
|
{name: "appart", amount: 800, delay: 0, repeat: $scope.config.lines, enabled: true},
|
|
{name: "assurance voiture", amount: 50, delay: 0, repeat: $scope.config.lines, enabled: true},
|
|
{name: "internet", amount: 20, delay: 0, repeat: $scope.config.lines, enabled: true},
|
|
{name: "elec", amount: 100, delay: 0, repeat: $scope.config.lines, enabled: true},
|
|
{name: "chat", amount: 20, delay: 0, repeat: $scope.config.lines, enabled: true},
|
|
{name: "transports", amount: 70, delay: 0, repeat: $scope.config.lines, enabled: false},
|
|
];
|
|
|
|
// $scope.expenses=[];
|
|
$scope.expenses = exampleExpenses;
|
|
|
|
/**
|
|
* sum of all monthly expenses, ignoring delay
|
|
* @returns {number}
|
|
*/
|
|
$scope.sumMonthlyExpenses = () => {
|
|
let sum = 0;
|
|
$scope.expenses.forEach((elem) => {
|
|
if (elem.enabled) {
|
|
sum += elem.amount;
|
|
}
|
|
})
|
|
return sum;
|
|
};
|
|
$scope.previsionTable = [];
|
|
$scope.calculatePrevisionTable = () => {
|
|
let turns = $scope.config.lines;
|
|
let monthly = $scope.sumMonthlyExpenses();
|
|
let available = $scope.config.disponibility;
|
|
let previsionTable = [];
|
|
let changedNoMoneyConfig = false;
|
|
$scope.config.monthsBeforeNoMoney = null;
|
|
for (let i = 0; i <= turns; i++) {
|
|
// TODO take in account delays in expenses
|
|
available = available - monthly + $scope.config.averageMonthlyEarnings;
|
|
let newLine = {
|
|
expense : monthly,
|
|
available: available,
|
|
};
|
|
|
|
if (available <= 0 && !changedNoMoneyConfig) {
|
|
$scope.config.monthsBeforeNoMoney = i;
|
|
changedNoMoneyConfig = true;
|
|
}
|
|
previsionTable.push(newLine);
|
|
}
|
|
$scope.previsionTable = previsionTable;
|
|
$scope.makeGraphPointsOfPrevisionTable(previsionTable);
|
|
return previsionTable;
|
|
};
|
|
$scope.graphPointsPrevision = [];
|
|
$scope.makeGraphPointsOfPrevisionTable = (previsionTable) => {
|
|
console.log("previsionTable", previsionTable);
|
|
$scope.graphPointsPrevision = [];
|
|
for (let i = 0; i < previsionTable.length; i++) {
|
|
$scope.graphPointsPrevision.push({
|
|
label: previsionTable[i].available + " euros restants dans " + i + " mois",
|
|
y : previsionTable[i].available,
|
|
x : i,
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
$scope.updateconf = (rep) => {
|
|
// update view calculs
|
|
$scope.calculatePrevisionTable();
|
|
$scope.updateCanevas()
|
|
// flags
|
|
$scope.config.loading = false;
|
|
$scope.config.initialLoadingDone = true;
|
|
$scope.config.disponibility = rep.data.disponibility;
|
|
$scope.config.averageMonthlyEarnings = rep.data.averageMonthlyEarnings;
|
|
// default data when user has nothing saved
|
|
console.log('rep.data.expenses.length', rep.data.expenses.length)
|
|
if (!rep.data.expenses.length) {
|
|
$scope.expenses = exampleExpenses;
|
|
} else {
|
|
$scope.expenses = rep.data.expenses;
|
|
}
|
|
};
|
|
// http related calls
|
|
$scope.fetchExpenses = () => {
|
|
console.log('fetch expenses...');
|
|
$scope.config.loading = true;
|
|
|
|
$http.get('get-my-expenses').then((rep) => {
|
|
console.log('get-my-expenses', rep.data.expenses);
|
|
$scope.updateconf(rep)
|
|
},
|
|
$scope.manageError)
|
|
};
|
|
$scope.save = function () {
|
|
if ($scope.config.loading) {
|
|
console.log('already saving');
|
|
return;
|
|
}
|
|
console.log('update expenses...');
|
|
$scope.config.loading = true;
|
|
$http.post('save-my-expenses', {
|
|
expenses: $scope.expenses,
|
|
config : $scope.config
|
|
})
|
|
.then((rep) => {
|
|
console.log('save-my-expenses', rep);
|
|
$scope.updateconf(rep)
|
|
},
|
|
$scope.manageError)
|
|
};
|
|
$scope.addExpense = function () {
|
|
$scope.expenses.push({
|
|
name : "",
|
|
repeat: 0,
|
|
delay : 0,
|
|
amount: 0,
|
|
})
|
|
};
|
|
$scope.init = function () {
|
|
$scope.fetchExpenses();
|
|
};
|
|
$scope.manageError = (error) => {
|
|
console.error(error);
|
|
$scope.config.loading = false;
|
|
|
|
}
|
|
$scope.updateCanevas = function () {
|
|
var dataPoints = $scope.graphPointsPrevision;
|
|
var chartContainer = new CanvasJS.Chart("simulationPrevision", {
|
|
title: {
|
|
text: "Euros disponibles dans le temps"
|
|
},
|
|
// animationEnabled: true,
|
|
data : [
|
|
{
|
|
// Change type to "doughnut", "line", "splineArea", etc.
|
|
type : "splineArea",
|
|
dataPoints: dataPoints
|
|
}
|
|
]
|
|
});
|
|
chartContainer.render();
|
|
}
|
|
$scope.init();
|
|
};
|