newOrder.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. let newOrder = {
  2. display: function(Order){
  3. document.getElementById("sidebarDiv").classList.add("sidebarWide");
  4. document.getElementById("newOrderIngredientList").style.display = "flex";
  5. let selectedList = document.getElementById("selectedIngredientList");
  6. while(selectedList.children.length > 0){
  7. selectedList.removeChild(selectedList.firstChild);
  8. }
  9. let ingredientList = document.getElementById("newOrderIngredients");
  10. while(ingredientList.children.length > 0){
  11. ingredientList.removeChild(ingredientList.firstChild);
  12. }
  13. for(let i = 0; i < merchant.ingredients.length; i++){
  14. let ingredient = document.createElement("button");
  15. ingredient.classList = "choosable";
  16. ingredient.innerText = merchant.ingredients[i].ingredient.name;
  17. ingredient.onclick = ()=>{this.addIngredient(merchant.ingredients[i], ingredient)};
  18. ingredientList.appendChild(ingredient);
  19. }
  20. document.getElementById("submitNewOrder").onclick = ()=>{this.submit(Order)};
  21. },
  22. addIngredient: function(ingredient, element){
  23. element.style.display = "none";
  24. let div = document.getElementById("selectedIngredient").content.children[0].cloneNode(true);
  25. div.ingredient = ingredient;
  26. div.children[0].children[1].onclick = ()=>{this.removeIngredient(div, element)};
  27. //Display units depending on the whether it is a special unit
  28. if(ingredient.ingredient.specialUnit === "bottle"){
  29. div.children[0].children[0].innerText = `${ingredient.ingredient.name} (BOTTLES)`;
  30. }else{
  31. div.children[0].children[0].innerText = `${ingredient.ingredient.name} (${ingredient.ingredient.unit.toUpperCase()})`;
  32. }
  33. document.getElementById("selectedIngredientList").appendChild(div);
  34. },
  35. removeIngredient: function(selectedElement, element){
  36. selectedElement.parentElement.removeChild(selectedElement);
  37. element.style.display = "block";
  38. },
  39. submit: function(Order){
  40. let date = document.getElementById("newOrderDate").value;
  41. let taxes = document.getElementById("orderTaxes").value * 100;
  42. let fees = document.getElementById("orderFees").value * 100;
  43. let ingredients = document.getElementById("selectedIngredientList").children;
  44. if(date === ""){
  45. banner.createError("DATE IS REQUIRED FOR ORDERS");
  46. return;
  47. }
  48. let data = {
  49. name: document.getElementById("newOrderName").value,
  50. date: date,
  51. taxes: taxes,
  52. fees: fees,
  53. ingredients: []
  54. }
  55. for(let i = 0; i < ingredients.length; i++){
  56. let quantity = ingredients[i].children[1].children[0].value;
  57. let price = ingredients[i].children[1].children[1].value;
  58. if(quantity === "" || price === ""){
  59. banner.createError("MUST PROVIDE QUANTITY AND PRICE PER UNIT FOR ALL INGREDIENTS");
  60. return;
  61. }
  62. if(quantity < 0 || price < 0){
  63. banner.createError("QUANTITY AND PRICE MUST BE NON-NEGATIVE NUMBERS");
  64. }
  65. if(ingredients[i].ingredient.ingredient.specialUnit === "bottle"){
  66. data.ingredients.push({
  67. ingredient: ingredients[i].ingredient.ingredient.id,
  68. quantity: quantity * ingredients[i].ingredient.ingredient.unitSize,
  69. pricePerUnit: this.convertPrice(ingredients[i].ingredient.ingredient, price * 100)
  70. });
  71. }else{
  72. data.ingredients.push({
  73. ingredient: ingredients[i].ingredient.ingredient.id,
  74. quantity: ingredients[i].ingredient.convertToBase(quantity),
  75. pricePerUnit: this.convertPrice(ingredients[i].ingredient.ingredient, price * 100)
  76. });
  77. }
  78. }
  79. let loader = document.getElementById("loaderContainer");
  80. loader.style.display = "flex";
  81. fetch("/order/create", {
  82. method: "post",
  83. headers: {
  84. "Content-Type": "application/json;charset=utf-8"
  85. },
  86. body: JSON.stringify(data)
  87. })
  88. .then((response)=>response.json())
  89. .then((response)=>{
  90. if(typeof(response) === "string"){
  91. banner.createError(response);
  92. }else{
  93. let order = new Order(
  94. response._id,
  95. response.name,
  96. response.date,
  97. response.taxes,
  98. response.fees,
  99. response.ingredients,
  100. merchant
  101. );
  102. merchant.addOrder(order, true);
  103. controller.openStrand("orders", merchant.orders);
  104. banner.createNotification("NEW ORDER CREATED");
  105. }
  106. })
  107. .catch((err)=>{
  108. banner.createError("SOMETHING WENT WRONG, PLEASE REFRESH THE PAGE");
  109. })
  110. .finally(()=>{
  111. loader.style.display = "none";
  112. });
  113. },
  114. convertPrice: function(ingredient, price){
  115. if(ingredient.specialUnit === "bottle"){
  116. return price / ingredient.unitSize;
  117. }
  118. switch(ingredient.unit){
  119. case "g": return price;
  120. case "kg": return price / 1000;
  121. case "oz": return price / 28.3495;
  122. case "lb": return price / 453.5924;
  123. case "ml": return price * 1000;
  124. case "l": return price;
  125. case "tsp": return price * 202.8842;
  126. case "tbsp": return price * 67.6278;
  127. case "ozfl": return price * 33.8141;
  128. case "cup": return price * 4.1667;
  129. case "pt": return price * 2.1134;
  130. case "qt": return price * 1.0567;
  131. case "gal": return price / 3.7854;
  132. case "mm": return price * 1000;
  133. case "cm": return price * 100;
  134. case "m": return price;
  135. case "in": return price * 39.3701;
  136. case "ft": return price * 3.2808;
  137. }
  138. }
  139. }
  140. module.exports = newOrder;