admin.js 11 KB

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