helper.js 7.1 KB

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