helper.js 7.2 KB

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