admin.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. const Merchant = require("../models/merchant.js");
  2. const Ingredient = require("../models/ingredient.js");
  3. const Recipe = require("../models/recipe.js");
  4. const Order = require("../models/order.js");
  5. const Transaction = require("../models/transaction.js");
  6. const helper = require("./helper.js");
  7. const fs = require("fs");
  8. module.exports = {
  9. /*
  10. POST: Adding data for admins
  11. req.files = {
  12. ingredients: txt
  13. recipes: txt
  14. orders: txt
  15. transactions: txt
  16. }
  17. */
  18. addData: function(req, res){
  19. Merchant.findOne({_id: req.session.merchant})
  20. .populate("inventory.ingredient")
  21. .populate("recipes")
  22. .then((merchant)=>{
  23. //Ingredients
  24. let newIngredients = [];
  25. let ingredientData = {};
  26. if(req.files.ingredients !== undefined){
  27. ingredientData = fs.readFileSync(req.files.ingredients.tempFilePath).toString();
  28. fs.unlink(req.files.ingredients.tempFilePath, ()=>{});
  29. ingredientData = ingredientData.split("\n");
  30. merchant.inventory = [];
  31. for(let i = 0; i < ingredientData.length; i++){
  32. if(ingredientData[i] === "") continue;
  33. let data = ingredientData[i].split(",");
  34. let ingredient = new Ingredient({
  35. name: data[0],
  36. category: data[1],
  37. unit: data[3],
  38. ingredients: [],
  39. convert: {
  40. toMass: data[6] || 0,
  41. toVolume: data[7] || 0,
  42. toLength: data[8] || 0,
  43. toBottle: 0
  44. }
  45. });
  46. switch(data[3]){
  47. case "g": ingredient.convert.toMass = 1; break;
  48. case "kg": ingredient.convert.toMass = 1; break;
  49. case "oz": ingredient.convert.toMass = 1; break;
  50. case "lb": ingredient.convert.toMass = 1; break;
  51. case "ml": ingredient.convert.toVolume = 1; break;
  52. case "l": ingredient.convert.toVolume = 1; break;
  53. case "tsp": ingredient.convert.toVolume = 1; break;
  54. case "tbsp": ingredient.convert.toVolume = 1; break;
  55. case "ozfl": ingredient.convert.toVolume = 1; break;
  56. case "cup": ingredient.convert.toVolume = 1; break;
  57. case "pt": ingredient.convert.toVolume = 1; break;
  58. case "qt": ingredient.convert.toVolume = 1; break;
  59. case "gal": ingredient.convert.toVolume = 1; break;
  60. case "mm": ingredient.convert.toLength = 1; break;
  61. case "cm": ingredient.convert.toLength = 1; break;
  62. case "m": ingredient.convert.toLength = 1; break;
  63. case "in": ingredient.convert.toLength = 1; break;
  64. case "ft": ingredient.convert.toLength = 1; break;
  65. case "bottle": ingredient.convert.toVolume = 1; break;
  66. }
  67. let merchIngredient = {
  68. ingredient: ingredient._id,
  69. quantity: helper.convertQuantityToBaseUnit(data[2], data[3]),
  70. };
  71. if(ingredient.unit === "bottle"){
  72. ingredient.altUnit = data[5];
  73. merchIngredient.quantity = helper.convertQuantityToBaseUnit(data[4], data[5]) * data[2];
  74. ingredient.convert.toBottle = data[2] / merchIngredient.quantity;
  75. }
  76. newIngredients.push(ingredient);
  77. merchant.inventory.push(merchIngredient);
  78. }
  79. }
  80. let indexIngredients = ()=>{
  81. let ingredients = {};
  82. let inventory = (req.files.ingredients === undefined) ? merchant.inventory : newIngredients;
  83. for(let i = 0; i < inventory.length; i++){
  84. if(req.files.ingredients === undefined){
  85. ingredients[inventory[i].ingredient.name.toLowerCase()] = inventory[i].ingredient;
  86. }else{
  87. ingredients[inventory[i].name.toLowerCase()] = inventory[i];
  88. }
  89. }
  90. return ingredients;
  91. }
  92. let ingredientIndices = indexIngredients();
  93. //Sub-ingredients
  94. if(req.files.ingredients !== undefined){
  95. for(let i = 0; i < ingredientData.length; i++){
  96. if(ingredientData[i] === "") continue;
  97. let data = ingredientData[i].split(",");
  98. for(let j = 9; j < data.length; j+=3){
  99. if(data[j] === "") break;
  100. ingredientIndices[data[0].toLowerCase()].ingredients.push({
  101. ingredient: ingredientIndices[data[j].toLowerCase()]._id,
  102. quantity: (data[j+1] * helper.convertQuantityToBaseUnit(1, data[j+2])) / helper.convertQuantityToBaseUnit(1, data[3]),
  103. unit: data[j+2]
  104. })
  105. }
  106. }
  107. }
  108. //Recipes
  109. let newRecipes = [];
  110. if(req.files.recipes !== undefined){
  111. let recipeData = fs.readFileSync(req.files.recipes.tempFilePath).toString();
  112. fs.unlink(req.files.recipes.tempFilePath, ()=>{});
  113. recipeData = recipeData.split("\n");
  114. merchant.recipes = [];
  115. for(let i = 0; i < recipeData.length; i++){
  116. if(recipeData[i] === "") continue;
  117. let data = recipeData[i].split(",");
  118. let recipe = new Recipe({
  119. merchant: merchant._id,
  120. name: data[0],
  121. price: parseInt(parseFloat(data[1]) * 100),
  122. category: data[2],
  123. ingredients: []
  124. });
  125. for(let j = 3; j < data.length; j+=3){
  126. if(data[j] === "") break;
  127. recipe.ingredients.push({
  128. ingredient: ingredientIndices[data[j].toLowerCase()],
  129. quantity: helper.convertQuantityToBaseUnit(parseFloat(data[j+1]), data[j+2]),
  130. unit: data[j+2]
  131. });
  132. }
  133. merchant.recipes.push(recipe);
  134. newRecipes.push(recipe);
  135. }
  136. }
  137. let indexRecipes = ()=>{
  138. let recipes = {};
  139. for(let i = 0; i < merchant.recipes.length; i++){
  140. recipes[merchant.recipes[i].name.toLowerCase()] = merchant.recipes[i];
  141. }
  142. return recipes;
  143. }
  144. let recipeIndices = indexRecipes();
  145. //Orders
  146. let newOrders = [];
  147. if(req.files.orders !== undefined){
  148. Order.deleteMany({merchant: req.body.id}).catch((err)=>{});
  149. let orderData = fs.readFileSync(req.files.orders.tempFilePath).toString();
  150. fs.unlink(req.files.orders.tempFilePath, ()=>{});
  151. orderData = orderData.split("\n");
  152. for(let i = 0; i < orderData.length; i++){
  153. if(orderData[i] === "") continue;
  154. let data = orderData[i].split(",");
  155. let order = new Order({
  156. merchant: merchant._id,
  157. name: data[0],
  158. date: new Date(data[1]),
  159. taxes: parseInt(parseFloat(data[2]) * 100),
  160. fees: parseInt(parseFloat(data[3]) * 100),
  161. ingredients: []
  162. });
  163. for(let j = 4; j < data.length; j+=3){
  164. if(data[j] === "") break;
  165. order.ingredients.push({
  166. ingredient: ingredientIndices[data[j].toLowerCase()],
  167. quantity: parseFloat(data[j+1]),
  168. pricePerUnit: parseInt(parseFloat(data[j+2]) * 100)
  169. });
  170. }
  171. newOrders.push(order);
  172. }
  173. }
  174. //Transactions
  175. let newTransactions = [];
  176. if(req.files.transactions !== undefined){
  177. Transaction.deleteMany({merchant: req.body.id}).catch((err)=>{});
  178. let transactionData = fs.readFileSync(req.files.transactions.tempFilePath).toString()
  179. fs.unlink(req.files.transactions.tempFilePath, ()=>{});
  180. transactionData = transactionData.split("\n");
  181. for(let i = 0; i < transactionData.length; i++){
  182. if(transactionData[i] === "") continue;
  183. let data = transactionData[i].split(",");
  184. let transaction = new Transaction({
  185. merchant: merchant._id,
  186. date: new Date(data[0]),
  187. recipes: []
  188. });
  189. for(let j = 1; j < data.length; j+=2){
  190. if(data[j] === "") break;
  191. transaction.recipes.push({
  192. recipe: recipeIndices[data[j].toLowerCase()],
  193. quantity: parseInt(data[j+1])
  194. });
  195. }
  196. newTransactions.push(transaction);
  197. }
  198. }
  199. return Promise.all([
  200. merchant.save(),
  201. Ingredient.create(newIngredients),
  202. Recipe.create(newRecipes),
  203. Order.create(newOrders),
  204. Transaction.create(newTransactions)
  205. ]);
  206. })
  207. .then((response)=>{
  208. return res.redirect("/dashboard");
  209. })
  210. .catch((err)=>{
  211. return res.json("ERROR: A whoopsie has been made");
  212. });
  213. }
  214. }