helper.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. getUnitType: function(unit){
  112. let unitType = "";
  113. switch(unit){
  114. case "g": unitType = "mass"; break;
  115. case "kg": unitType = "mass"; break;
  116. case "oz": unitType = "mass"; break;
  117. case "lb": unitType = "mass"; break;
  118. case "ml": unitType = "volume"; break;
  119. case "l": unitType = "volume"; break;
  120. case "tsp": unitType = "volume"; break;
  121. case "tbsp": unitType = "volume"; break;
  122. case "ozfl": unitType = "volume"; break;
  123. case "cup": unitType = "volume"; break;
  124. case "pt": unitType = "volume"; break;
  125. case "qt": unitType = "volume"; break;
  126. case "gal": unitType = "volume"; break;
  127. case "mm": unitType = "length"; break;
  128. case "cm": unitType = "length"; break;
  129. case "m": unitType = "length"; break;
  130. case "in": unitType = "length"; break;
  131. case "ft": unitType = "length"; break;
  132. default: unitType = "other"; break;
  133. }
  134. return unitType;
  135. },
  136. createRecipesFromSquare: function(squareItems, merchantId){
  137. let recipes = [];
  138. for(let i = 0; i < squareItems.length; i++){
  139. if(squareItems[i].item_data.variations.length > 1){
  140. for(let j = 0; j < squareItems[i].item_data.variations.length; j++){
  141. let item = squareItems[i].item_data.variations[j];
  142. let price = 0;
  143. if(item.item_variation_data.price_money !== undefined) price = item.item_variation_data.price_money.amount;
  144. let recipe = new Recipe({
  145. posId: item.id,
  146. merchant: merchantId,
  147. name: `${squareItems[i].item_data.name} '${item.item_variation_data.name}'`,
  148. price: price
  149. });
  150. recipes.push(recipe);
  151. }
  152. }else{
  153. let recipe = new Recipe({
  154. posId: squareItems[i].item_data.variations[0].id,
  155. merchant: merchantId,
  156. name: squareItems[i].item_data.name,
  157. price: squareItems[i].item_data.variations[0].item_variation_data.price_money.amount,
  158. ingredients: []
  159. });
  160. recipes.push(recipe);
  161. }
  162. }
  163. return recipes;
  164. },
  165. getAllMerchantTransactions: async function(merchant, token){
  166. let body = {
  167. location_ids: [merchant.locationId],
  168. limit: 10000,
  169. query: {}
  170. };
  171. let options = {
  172. headers: {
  173. "Authorization": `Bearer ${token}`,
  174. "Content-Type": "application/json"
  175. }
  176. };
  177. do{
  178. let response = await axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, body, options);
  179. body.cursor = response.data.cursor;
  180. let transactions = [];
  181. for(let i = 0; i < response.data.orders.length; i++){
  182. let transaction = new Transaction({
  183. merchant: merchant._id,
  184. date: new Date(response.data.orders[i].created_at),
  185. posId: response.data.orders[i].id,
  186. recipes: []
  187. });
  188. if(response.data.orders[i].line_items === undefined) continue;
  189. for(let j = 0; j < response.data.orders[i].line_items.length; j++){
  190. let item = response.data.orders[i].line_items[j];
  191. for(let k = 0; k < merchant.recipes.length; k++){
  192. if(merchant.recipes[k].posId === item.catalog_object_id){
  193. transaction.recipes.push({
  194. recipe: merchant.recipes[k]._id,
  195. quantity: parseInt(item.quantity)
  196. });
  197. }
  198. }
  199. }
  200. transactions.push(transaction);
  201. }
  202. Transaction.create(transactions);
  203. }while(body.cursor !== undefined);
  204. }
  205. }