helper.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. const axios = require("axios");
  2. const Transaction = require("../models/transaction.js");
  3. const Recipe = require("../models/recipe.js");
  4. module.exports = {
  5. getSquareData: function(owner, merchant, data){
  6. let ingredients = {};
  7. return axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, data, {
  8. headers: {Authorization: `Bearer ${owner.square.accessToken}`}
  9. })
  10. .then((response)=>{
  11. let transactions = [];
  12. if(response.data.orders){
  13. for(let i = 0; i < response.data.orders.length; i++){
  14. let transaction = new Transaction({
  15. merchant: merchant._id,
  16. date: response.data.orders[i].created_at,
  17. posId: response.data.orders[i].id,
  18. recipes: []
  19. });
  20. if(response.data.orders[i].line_items === undefined) continue;
  21. for(let j = 0; j < response.data.orders[i].line_items.length; j++){
  22. for(let k = 0; k < merchant.recipes.length; k++){
  23. if(response.data.orders[i].line_items[j].catalog_object_id === merchant.recipes[k].posId){
  24. let quantitySold = parseInt(response.data.orders[i].line_items[j].quantity);
  25. transaction.recipes.push({
  26. recipe: merchant.recipes[k],
  27. quantity: quantitySold
  28. });
  29. for(let l = 0; l < merchant.recipes[k].ingredients.length; l++){
  30. let ingredient = merchant.recipes[k].ingredients[l];
  31. let quantity = quantitySold * ingredient.quantity
  32. ingredients[ingredient.ingredient] = ingredients[ingredient.ingredient] + quantity || quantity;
  33. }
  34. break;
  35. }
  36. }
  37. }
  38. transactions.push(transaction);
  39. }
  40. return Transaction.create(transactions);
  41. }
  42. return [];
  43. })
  44. .then((transactions)=>{
  45. const keys = Object.keys(ingredients);
  46. for(let i = 0; i < keys.length; i++){
  47. for(let j = 0; j < merchant.inventory.length; j++){
  48. if(keys[i] === merchant.inventory[j].ingredient._id.toString()){
  49. merchant.inventory[j].quantity -= ingredients[keys[i]];
  50. break;
  51. }
  52. }
  53. }
  54. return transactions;
  55. })
  56. .catch((err)=>{
  57. return "ERROR: UNABLE TO UPDATE DATA";
  58. });
  59. },
  60. convertQuantityToBaseUnit: function(quantity, unit){
  61. switch(unit){
  62. case "kg": return quantity * 1000;
  63. case "oz": return quantity * 28.3495;
  64. case "lb": return quantity * 453.5924;
  65. case "ml": return quantity / 1000;
  66. case "tsp": return quantity / 202.8842;
  67. case "tbsp": return quantity / 67.6278;
  68. case "ozfl": return quantity / 33.8141;
  69. case "cup": return quantity / 4.1667;
  70. case "pt": return quantity / 2.1134;
  71. case "qt": return quantity / 1.0567;
  72. case "gal": return quantity * 3.7854;
  73. case "mm": return quantity / 1000;
  74. case "cm": return quantity / 100;
  75. case "in": return quantity / 39.3701;
  76. case "ft": return quantity / 3.2808;
  77. default: return quantity;
  78. }
  79. },
  80. convertPrice: function(price, unit){
  81. switch(unit){
  82. case "g":return price;
  83. case "kg": return price / 1000;
  84. case "oz": return price / 28.3495;
  85. case "lb": return price / 453.5924;
  86. case "ml": return price * 1000;
  87. case "l": return price;
  88. case "tsp": return price * 202.8842;
  89. case "tbsp": return price * 67.6278;
  90. case "ozfl": return price * 33.8141;
  91. case "cup": return price * 4.1667;
  92. case "pt": return price * 2.1134;
  93. case "qt": return price * 1.0567;
  94. case "gal": return price / 3.7854;
  95. case "mm": return price * 1000;
  96. case "cm": return price * 100;
  97. case "m": return price;
  98. case "in": return price * 39.3701;
  99. case "ft": return price * 3.2808;
  100. default: return price;
  101. }
  102. },
  103. generateId: function(length){
  104. let result = "";
  105. let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  106. for(let i = 0; i < length; i++){
  107. result += characters.charAt(Math.floor(Math.random() * characters.length));
  108. }
  109. return result;
  110. },
  111. createRecipesFromSquare: function(squareItems, categories, merchantId){
  112. let recipes = [];
  113. for(let i = 0; i < squareItems.length; i++){
  114. if(squareItems[i].item_data.variations.length > 1){
  115. for(let j = 0; j < squareItems[i].item_data.variations.length; j++){
  116. let item = squareItems[i].item_data.variations[j];
  117. let price = 0;
  118. if(item.item_variation_data.price_money !== undefined) price = item.item_variation_data.price_money.amount;
  119. let recipe = new Recipe({
  120. posId: item.id,
  121. merchant: merchantId,
  122. name: `${squareItems[i].item_data.name} '${item.item_variation_data.name}'`,
  123. price: price,
  124. category: ""
  125. });
  126. for(let k = 0; k < categories.length; k++){
  127. if(squareItems[i].item_data.category_id === categories[k].id){
  128. recipe.category = categories[k].category_data.name;
  129. break;
  130. }
  131. }
  132. recipes.push(recipe);
  133. }
  134. }else{
  135. let priceMoney = squareItems[i].item_data.variations[0].item_variation_data.price_money;
  136. let price = (priceMoney === undefined) ? 0 : priceMoney.amount;
  137. let recipe = new Recipe({
  138. posId: squareItems[i].item_data.variations[0].id,
  139. merchant: merchantId,
  140. name: squareItems[i].item_data.name,
  141. price: price,
  142. ingredients: [],
  143. category: ""
  144. });
  145. for(let j = 0; j < categories.length; j++){
  146. if(squareItems[i].item_data.category_id === categories[j].id){
  147. recipe.category = categories[j].category_data.name;
  148. break;
  149. }
  150. }
  151. recipes.push(recipe);
  152. }
  153. }
  154. return recipes;
  155. },
  156. getAllMerchantTransactions: async function(merchant, token){
  157. let body = {
  158. location_ids: [merchant.locationId],
  159. limit: 10000,
  160. query: {}
  161. };
  162. let options = {
  163. headers: {
  164. "Authorization": `Bearer ${token}`,
  165. "Content-Type": "application/json"
  166. }
  167. };
  168. do{
  169. let response = await axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, body, options);
  170. if(response.data.orders === undefined) break;
  171. body.cursor = response.data.cursor;
  172. let transactions = [];
  173. for(let i = 0; i < response.data.orders.length; i++){
  174. let transaction = new Transaction({
  175. merchant: merchant._id,
  176. date: new Date(response.data.orders[i].created_at),
  177. posId: response.data.orders[i].id,
  178. recipes: []
  179. });
  180. if(response.data.orders[i].line_items === undefined) continue;
  181. for(let j = 0; j < response.data.orders[i].line_items.length; j++){
  182. let item = response.data.orders[i].line_items[j];
  183. for(let k = 0; k < merchant.recipes.length; k++){
  184. if(merchant.recipes[k].posId === item.catalog_object_id){
  185. transaction.recipes.push({
  186. recipe: merchant.recipes[k]._id,
  187. quantity: parseInt(item.quantity)
  188. });
  189. }
  190. }
  191. }
  192. transactions.push(transaction);
  193. }
  194. Transaction.create(transactions);
  195. }while(body.cursor !== undefined);
  196. }
  197. }