helper.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. const axios = require("axios");
  2. const Transaction = require("../models/transaction.js");
  3. module.exports = {
  4. getSquareData: function(owner, merchant, data){
  5. let ingredients = {};
  6. return axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, data, {
  7. headers: {Authorization: `Bearer ${owner.square.accessToken}`}
  8. })
  9. .then((response)=>{
  10. let transactions = [];
  11. if(response.data.orders){
  12. for(let i = 0; i < response.data.orders.length; i++){
  13. let transaction = new Transaction({
  14. merchant: merchant._id,
  15. date: response.data.orders[i].created_at,
  16. posId: response.data.orders[i].id,
  17. recipes: []
  18. });
  19. for(let j = 0; j < response.data.orders[i].line_items.length; j++){
  20. for(let k = 0; k < merchant.recipes.length; k++){
  21. if(response.data.orders[i].line_items[j].catalog_object_id === merchant.recipes[k].posId){
  22. let quantitySold = parseInt(response.data.orders[i].line_items[j].quantity);
  23. transaction.recipes.push({
  24. recipe: merchant.recipes[k],
  25. quantity: quantitySold
  26. });
  27. for(let l = 0; l < merchant.recipes[k].ingredients.length; l++){
  28. let ingredient = merchant.recipes[k].ingredients[l];
  29. let quantity = quantitySold * ingredient.quantity
  30. ingredients[ingredient.ingredient] = ingredients[ingredient.ingredient] + quantity || quantity;
  31. }
  32. break;
  33. }
  34. }
  35. }
  36. transactions.push(transaction);
  37. }
  38. return Transaction.create(transactions);
  39. }
  40. return [];
  41. })
  42. .then((transactions)=>{
  43. const keys = Object.keys(ingredients);
  44. for(let i = 0; i < keys.length; i++){
  45. for(let j = 0; j < merchant.inventory.length; j++){
  46. if(keys[i] === merchant.inventory[j].ingredient._id.toString()){
  47. merchant.inventory[j].quantity -= ingredients[keys[i]];
  48. break;
  49. }
  50. }
  51. }
  52. return transactions;
  53. })
  54. .catch((err)=>{
  55. console.log(err.response.data);
  56. return "ERROR: UNABLE TO UPDATE DATA";
  57. });
  58. },
  59. convertQuantityToBaseUnit: function(quantity, unit){
  60. switch(unit){
  61. case "kg": return quantity * 1000;
  62. case "oz": return quantity * 28.3495;
  63. case "lb": return quantity * 453.5924;
  64. case "ml": return quantity / 1000;
  65. case "tsp": return quantity / 202.8842;
  66. case "tbsp": return quantity / 67.6278;
  67. case "ozfl": return quantity / 33.8141;
  68. case "cup": return quantity / 4.1667;
  69. case "pt": return quantity / 2.1134;
  70. case "qt": return quantity / 1.0567;
  71. case "gal": return quantity * 3.7854;
  72. case "mm": return quantity / 1000;
  73. case "cm": return quantity / 100;
  74. case "in": return quantity / 39.3701;
  75. case "ft": return quantity / 3.2808;
  76. default: return quantity;
  77. }
  78. },
  79. convertPrice: function(price, unit){
  80. switch(unit){
  81. case "g":return price;
  82. case "kg": return price / 1000;
  83. case "oz": return price / 28.3495;
  84. case "lb": return price / 453.5924;
  85. case "ml": return price * 1000;
  86. case "l": return price;
  87. case "tsp": return price * 202.8842;
  88. case "tbsp": return price * 67.6278;
  89. case "ozfl": return price * 33.8141;
  90. case "cup": return price * 4.1667;
  91. case "pt": return price * 2.1134;
  92. case "qt": return price * 1.0567;
  93. case "gal": return price / 3.7854;
  94. case "mm": return price * 1000;
  95. case "cm": return price * 100;
  96. case "m": return price;
  97. case "in": return price * 39.3701;
  98. case "ft": return price * 3.2808;
  99. default: return price;
  100. }
  101. },
  102. generateId: function(length){
  103. let result = "";
  104. let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  105. for(let i = 0; i < length; i++){
  106. result += characters.charAt(Math.floor(Math.random() * characters.length));
  107. }
  108. return result;
  109. },
  110. isSanitary: function(strings){
  111. let disallowed = ["\\", "<", ">", "$", "{", "}", "."];
  112. for(let i = 0; i < strings.length; i++){
  113. for(let j = 0; j < disallowed.length; j++){
  114. if(strings[i].includes(disallowed[j])){
  115. return false;
  116. }
  117. }
  118. }
  119. return true;
  120. },
  121. getUnitType: function(unit){
  122. let unitType = "";
  123. switch(unit){
  124. case "g": unitType = "mass"; break;
  125. case "kg": unitType = "mass"; break;
  126. case "oz": unitType = "mass"; break;
  127. case "lb": unitType = "mass"; break;
  128. case "ml": unitType = "volume"; break;
  129. case "l": unitType = "volume"; break;
  130. case "tsp": unitType = "volume"; break;
  131. case "tbsp": unitType = "volume"; break;
  132. case "ozfl": unitType = "volume"; break;
  133. case "cup": unitType = "volume"; break;
  134. case "pt": unitType = "volume"; break;
  135. case "qt": unitType = "volume"; break;
  136. case "gal": unitType = "volume"; break;
  137. case "mm": unitType = "length"; break;
  138. case "cm": unitType = "length"; break;
  139. case "m": unitType = "length"; break;
  140. case "in": unitType = "length"; break;
  141. case "ft": unitType = "length"; break;
  142. default: unitType = "other"; break;
  143. }
  144. return unitType;
  145. }
  146. }