orderData.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. const Order = require("../models/order.js");
  2. const Merchant = require("../models/merchant.js");
  3. const ObjectId = require("mongoose").Types.ObjectId;
  4. const Validator = require("./validator.js");
  5. const xlsx = require("xlsx");
  6. const fs = require("fs");
  7. module.exports = {
  8. /*
  9. GET - get the 25 most recent orders
  10. return = [
  11. _id: id of order,
  12. name: user created id for order,
  13. date: date order was created,
  14. ingredients: [{
  15. _id: unused id of this object,
  16. ingredient: id of the ingredient,
  17. price: price per unit of the ingredient,
  18. quantity: quantity of ingredient in this order
  19. }]
  20. ]
  21. */
  22. getOrders: function(req, res){
  23. if(!req.session.user){
  24. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  25. return res.redirect("/");
  26. }
  27. Order.aggregate([
  28. {$match: {merchant: ObjectId(req.session.user)}},
  29. {$sort: {date: -1}},
  30. {$limit: 25},
  31. {$project: {
  32. name: 1,
  33. date: 1,
  34. taxes: 1,
  35. fees: 1,
  36. ingredients: 1
  37. }}
  38. ])
  39. .then((orders)=>{
  40. return res.json(orders);
  41. })
  42. .catch((err)=>{
  43. return res.json("ERROR: UNABLE TO RETRIEVE YOUR ORDERS");
  44. });
  45. },
  46. /*
  47. POST - retrieves a list of transactions based on the filter
  48. req.body = {
  49. startDate: starting date to filter on,
  50. endDate: ending date to filter on,
  51. ingredients: list of recipes.to filter on
  52. }
  53. */
  54. orderFilter: function(req, res){
  55. if(!req.session.user){
  56. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  57. return res.redirect("/");
  58. }
  59. let objectifiedIngredients = [];
  60. for(let i = 0; i < req.body.ingredients.length; i++){
  61. objectifiedIngredients.push(new ObjectId(req.body.ingredients[i]));
  62. }
  63. let startDate = new Date(req.body.startDate);
  64. let endDate = new Date(req.body.endDate);
  65. endDate = new Date(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1);
  66. Order.aggregate([
  67. {$match: {
  68. merchant: new ObjectId(req.session.user),
  69. date: {
  70. $gte: startDate,
  71. $lt: endDate
  72. },
  73. ingredients: {
  74. $elemMatch: {
  75. ingredient: {
  76. $in: objectifiedIngredients
  77. }
  78. }
  79. }
  80. }},
  81. {$sort: {date: -1}}
  82. ])
  83. .then((orders)=>{
  84. return res.json(orders);
  85. })
  86. .catch((err)=>{
  87. return res.json("ERROR: UNABLE TO RETRIEVE YOUR TRANSACTIONS");
  88. });
  89. },
  90. /*
  91. POST - Creates a new order from the site
  92. req.body = {
  93. name: user created order id
  94. date: creation date
  95. ingredients: [{
  96. ingredient: id of the ingredient
  97. quantity: amount of the ingredient purchased
  98. pricePerUnit: price per gram
  99. }]
  100. }
  101. */
  102. createOrder: function(req, res){
  103. if(!req.session.user){
  104. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  105. return res.redirect("/");
  106. }
  107. let validation = Validator.order(req.body);
  108. if(validation !== true){
  109. return res.json(validation);
  110. }
  111. let newOrder = new Order(req.body);
  112. newOrder.merchant = req.session.user;
  113. newOrder.save()
  114. .then((response)=>{
  115. res.json(response);
  116. })
  117. .catch((err)=>{
  118. return res.json("ERROR: UNABLE TO SAVE ORDER");
  119. });
  120. Merchant.findOne({_id: req.session.user})
  121. .then((merchant)=>{
  122. for(let i = 0; i < req.body.ingredients.length; i++){
  123. for(let j = 0; j < merchant.inventory.length; j++){
  124. if(req.body.ingredients[i].ingredient === merchant.inventory[j].ingredient.toString()){
  125. merchant.inventory[j].quantity += parseFloat(req.body.ingredients[i].quantity);
  126. }
  127. }
  128. }
  129. return merchant.save();
  130. })
  131. .then((merchant)=>{
  132. return;
  133. })
  134. .catch(()=>{});
  135. },
  136. /*
  137. DELETE - Remove an order from the database
  138. */
  139. removeOrder: function(req, res){
  140. if(!req.session.user){
  141. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  142. return res.redirect("/");
  143. }
  144. let merchant = {};
  145. let order = {}
  146. Merchant.findOne({_id: req.session.user})
  147. .then((response)=>{
  148. merchant = response;
  149. return Order.findOne({_id: req.params.id});
  150. })
  151. .then((response)=>{
  152. order = response;
  153. return Order.deleteOne({_id: req.params.id})
  154. })
  155. .then((response)=>{
  156. res.json({});
  157. for(let i = 0; i < order.ingredients.length; i++){
  158. for(let j = 0; j < merchant.inventory.length; j++){
  159. if(order.ingredients[i].ingredient.toString() === merchant.inventory[j].ingredient.toString()){
  160. merchant.inventory[j].quantity -= order.ingredients[i].quantity;
  161. break;
  162. }
  163. }
  164. }
  165. return merchant.save();
  166. })
  167. .catch((err)=>{
  168. return res.json("ERROR: UNABLE TO REMOVE ORDER");
  169. });
  170. },
  171. createFromSpreadsheet: function(req, res){
  172. if(!req.session.user){
  173. req.session.error = "MUST BE LOGGED IN TO DO THAT";
  174. return res.redirect("/");
  175. }
  176. //read file, get the correct sheet, create array from sheet
  177. let workbook = xlsx.readFile(req.file.path);
  178. fs.unlink(req.file.path, ()=>{});
  179. let sheets = Object.keys(workbook.Sheets);
  180. console.log(sheets);
  181. let sheet = {};
  182. for(let i = 0; i < sheets.length; i++){
  183. let str = sheets[i].toLowerCase();
  184. if(str === "order" || str === "orders"){
  185. sheet = workbook.Sheets[sheets[i]];
  186. }
  187. }
  188. const array = xlsx.utils.sheet_to_json(sheet, {
  189. header: 1
  190. });
  191. console.log(array);
  192. }
  193. }