| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- let orderCalculator = {
- display: function(){
- let to = new Date();
- to.setDate(to.getDate() + 7);
- to.setHours(0, 0, 0, 0);
- from = new Date();
- from.setDate(from.getDate() + 1);
- from.setHours(0, 0, 0, 0);
- document.getElementById("predictDateFrom").valueAsDate = from;
- document.getElementById("predictDateTo").valueAsDate = to;
- document.getElementById("predictButton").onclick = ()=>{this.predict()};
- let selector = document.getElementById("predictSelector");
- while(selector.children.length > 0){
- selector.removeChild(selector.firstChild);
- }
- for(let i = 0; i < merchant.ingredients.length; i++){
- let option = document.createElement("option");
- option.innerText = merchant.ingredients[i].ingredient.name;
- option.value = merchant.ingredients[i].ingredient.id;
- selector.appendChild(option);
- }
- },
- predict: function(){
- let from = document.getElementById("predictDateFrom").valueAsDate;
- let to = document.getElementById("predictDateTo").valueAsDate;
- let ingredient = merchant.getIngredient(document.getElementById("predictSelector").value);
- let data = {
- to: new Date(),
- recipes: []
- }
- data.from = new Date(data.to.getFullYear() - 1, data.to.getMonth(), data.to.getDate());
- fetch("/transaction", {
- method: "post",
- headers: {
- "Content-Type": "application/json;charset=utf-8"
- },
- body: JSON.stringify(data)
- })
- .then(response => response.json())
- .then((response)=>{
- if(typeof(response) === "string"){
- controller.createBanner(response, "error");
- }else{
- const options = {
- task: "regression",
- debug: false
- }
- const nn = ml5.neuralNetwork(options);
- this.createData(nn, response, ingredient.ingredient);
- nn.normalizeData();
- nn.train(()=>{
- let predictors = [];
- while(from <= to){
- predictors.push(nn.predict({
- month: from.getMonth(),
- day: from.getDay()
- }))
- from.setDate(from.getDate() + 1);
- }
- Promise.all(predictors)
- .then((predictions)=>{
- let total = 0
- for(let i = 0; i < predictions.length; i++){
- total += predictions[i][0].value;
- }
- if(isNaN(total)) total = 0;
- document.getElementById("prediction").innerText = `${total.toFixed(2)} ${ingredient.ingredient.unit.toUpperCase()}`;
- })
- .catch((err)=>{
- controller.createBanner("ERROR: UNABLE TO MAKE PREDICTION", "error");
- });
- });
- }
- })
- .catch((err)=>{
- controller.createBanner("ERROR: UNABLE TO MAKE PREDICTION", "error");
- });
- },
- createData: function(nn, transactions, ingredient){
- let today = new Date(transactions[transactions.length-1].date);
- today.setHours(0, 0, 0, 0);
- let tomorrow = new Date(transactions[transactions.length-1].date);
- tomorrow.setDate(tomorrow.getDate() + 1);
- tomorrow.setHours(0, 0, 0, 0);
- let dailySum = 0;
- for(let i = transactions.length - 1; i >= 0; i--){
- transactions[i].date = new Date(transactions[i].date);
- if(transactions[i].date >= tomorrow){
- let inputs = {
- month: today.getMonth(),
- day: today.getDay()
- };
- let output = {quantity: dailySum};
- nn.addData(inputs, output);
- dailySum = 0;
- today.setDate(today.getDate() + 1);
- tomorrow.setDate(tomorrow.getDate() + 1);
- }
- for(let j = 0; j < transactions[i].recipes.length; j++){
- for(let k = 0; k < merchant.recipes.length; k++){
- if(merchant.recipes[k].id === transactions[i].recipes[j].recipe){
- for(let l = 0; l < merchant.recipes[k].ingredients.length; l++){
- if(merchant.recipes[k].ingredients[l].ingredient === ingredient){
- dailySum += merchant.recipes[k].ingredients[l].quantity * transactions[i].recipes[j].quantity;
- break;
- }
- }
- break;
- }
- }
- }
- }
- }
- }
- module.exports = orderCalculator;
|