orderCalculator.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. let orderCalculator = {
  2. display: function(){
  3. let to = new Date();
  4. to.setDate(to.getDate() + 7);
  5. to.setHours(0, 0, 0, 0);
  6. from = new Date();
  7. from.setDate(from.getDate() + 1);
  8. from.setHours(0, 0, 0, 0);
  9. document.getElementById("predictDateFrom").valueAsDate = from;
  10. document.getElementById("predictDateTo").valueAsDate = to;
  11. document.getElementById("predictButton").addEventListener("click", ()=>{this.predict()});
  12. let selector = document.getElementById("predictSelector");
  13. for(let i = 0; i < merchant.ingredients.length; i++){
  14. let option = document.createElement("option");
  15. option.innerText = merchant.ingredients[i].ingredient.name;
  16. option.value = merchant.ingredients[i].ingredient.id;
  17. selector.appendChild(option);
  18. }
  19. },
  20. predict: function(){
  21. let from = document.getElementById("predictDateFrom").valueAsDate;
  22. let to = document.getElementById("predictDateTo").valueAsDate;
  23. let ingredient = merchant.getIngredient(document.getElementById("predictSelector").value);
  24. let data = {
  25. to: new Date(),
  26. recipes: []
  27. }
  28. data.from = new Date(data.to.getFullYear() - 1, data.to.getMonth(), data.to.getDate());
  29. fetch("/transaction", {
  30. method: "post",
  31. headers: {
  32. "Content-Type": "application/json;charset=utf-8"
  33. },
  34. body: JSON.stringify(data)
  35. })
  36. .then(response => response.json())
  37. .then((response)=>{
  38. if(typeof(response) === "string"){
  39. controller.createBanner(response, "error");
  40. }else{
  41. const options = {
  42. task: "regression",
  43. debug: false
  44. }
  45. const nn = ml5.neuralNetwork(options);
  46. this.createData(nn, response, ingredient.ingredient);
  47. nn.normalizeData();
  48. nn.train(()=>{
  49. let predictors = [];
  50. while(from <= to){
  51. predictors.push(nn.predict({
  52. month: from.getMonth(),
  53. day: from.getDay()
  54. }))
  55. from.setDate(from.getDate() + 1);
  56. }
  57. Promise.all(predictors)
  58. .then((predictions)=>{
  59. let total = 0
  60. for(let i = 0; i < predictions.length; i++){
  61. total += predictions[i][0].value;
  62. }
  63. if(isNaN(total)) total = 0;
  64. document.getElementById("prediction").innerText = `${total.toFixed(2)} ${ingredient.ingredient.unit.toUpperCase()}`;
  65. })
  66. .catch((err)=>{
  67. controller.createBanner("ERROR: UNABLE TO MAKE PREDICTION", "error");
  68. });
  69. });
  70. }
  71. })
  72. .catch((err)=>{
  73. controller.createBanner("ERROR: UNABLE TO MAKE PREDICTION", "error");
  74. });
  75. },
  76. createData: function(nn, transactions, ingredient){
  77. let today = new Date(transactions[transactions.length-1].date);
  78. today.setHours(0, 0, 0, 0);
  79. let tomorrow = new Date(transactions[transactions.length-1].date);
  80. tomorrow.setDate(tomorrow.getDate() + 1);
  81. tomorrow.setHours(0, 0, 0, 0);
  82. let dailySum = 0;
  83. for(let i = transactions.length - 1; i >= 0; i--){
  84. transactions[i].date = new Date(transactions[i].date);
  85. if(transactions[i].date >= tomorrow){
  86. let inputs = {
  87. month: today.getMonth(),
  88. day: today.getDay()
  89. };
  90. let output = {quantity: dailySum};
  91. nn.addData(inputs, output);
  92. dailySum = 0;
  93. today.setDate(today.getDate() + 1);
  94. tomorrow.setDate(tomorrow.getDate() + 1);
  95. }
  96. for(let j = 0; j < transactions[i].recipes.length; j++){
  97. for(let k = 0; k < merchant.recipes.length; k++){
  98. if(merchant.recipes[k].id === transactions[i].recipes[j].recipe){
  99. for(let l = 0; l < merchant.recipes[k].ingredients.length; l++){
  100. if(merchant.recipes[k].ingredients[l].ingredient === ingredient){
  101. dailySum += merchant.recipes[k].ingredients[l].quantity * transactions[i].recipes[j].quantity;
  102. }
  103. break;
  104. }
  105. break;
  106. }
  107. }
  108. }
  109. }
  110. }
  111. }
  112. module.exports = orderCalculator;