orderCalculator.js 5.1 KB

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