| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- const axios = require("axios");
- const Transaction = require("../models/transaction.js");
- const Recipe = require("../models/recipe.js");
- module.exports = {
- getSquareData: function(owner, merchant, data){
- let ingredients = {};
- return axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, data, {
- headers: {Authorization: `Bearer ${owner.square.accessToken}`}
- })
- .then((response)=>{
- let transactions = [];
- if(response.data.orders){
- for(let i = 0; i < response.data.orders.length; i++){
- let transaction = new Transaction({
- merchant: merchant._id,
- date: response.data.orders[i].created_at,
- posId: response.data.orders[i].id,
- recipes: []
- });
- if(response.data.orders[i].line_items === undefined) continue;
- for(let j = 0; j < response.data.orders[i].line_items.length; j++){
- for(let k = 0; k < merchant.recipes.length; k++){
- if(response.data.orders[i].line_items[j].catalog_object_id === merchant.recipes[k].posId){
- let quantitySold = parseInt(response.data.orders[i].line_items[j].quantity);
- transaction.recipes.push({
- recipe: merchant.recipes[k],
- quantity: quantitySold
- });
- for(let l = 0; l < merchant.recipes[k].ingredients.length; l++){
- let ingredient = merchant.recipes[k].ingredients[l];
- let quantity = quantitySold * ingredient.quantity
- ingredients[ingredient.ingredient] = ingredients[ingredient.ingredient] + quantity || quantity;
- }
- break;
- }
- }
- }
- transactions.push(transaction);
- }
- return Transaction.create(transactions);
- }
- return [];
- })
- .then((transactions)=>{
- const keys = Object.keys(ingredients);
- for(let i = 0; i < keys.length; i++){
- for(let j = 0; j < merchant.inventory.length; j++){
- if(keys[i] === merchant.inventory[j].ingredient._id.toString()){
- merchant.inventory[j].quantity -= ingredients[keys[i]];
- break;
- }
- }
- }
- return transactions;
- })
- .catch((err)=>{
- return "ERROR: UNABLE TO UPDATE DATA";
- });
- },
- convertQuantityToBaseUnit: function(quantity, unit){
- switch(unit){
- case "kg": return quantity * 1000;
- case "oz": return quantity * 28.3495;
- case "lb": return quantity * 453.5924;
- case "ml": return quantity / 1000;
- case "tsp": return quantity / 202.8842;
- case "tbsp": return quantity / 67.6278;
- case "ozfl": return quantity / 33.8141;
- case "cup": return quantity / 4.1667;
- case "pt": return quantity / 2.1134;
- case "qt": return quantity / 1.0567;
- case "gal": return quantity * 3.7854;
- case "mm": return quantity / 1000;
- case "cm": return quantity / 100;
- case "in": return quantity / 39.3701;
- case "ft": return quantity / 3.2808;
- default: return quantity;
- }
- },
- convertPrice: function(price, unit){
- switch(unit){
- case "g":return price;
- case "kg": return price / 1000;
- case "oz": return price / 28.3495;
- case "lb": return price / 453.5924;
- case "ml": return price * 1000;
- case "l": return price;
- case "tsp": return price * 202.8842;
- case "tbsp": return price * 67.6278;
- case "ozfl": return price * 33.8141;
- case "cup": return price * 4.1667;
- case "pt": return price * 2.1134;
- case "qt": return price * 1.0567;
- case "gal": return price / 3.7854;
- case "mm": return price * 1000;
- case "cm": return price * 100;
- case "m": return price;
- case "in": return price * 39.3701;
- case "ft": return price * 3.2808;
- default: return price;
- }
- },
- generateId: function(length){
- let result = "";
- let characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for(let i = 0; i < length; i++){
- result += characters.charAt(Math.floor(Math.random() * characters.length));
- }
-
- return result;
- },
- getUnitType: function(unit){
- let unitType = "";
- switch(unit){
- case "g": unitType = "mass"; break;
- case "kg": unitType = "mass"; break;
- case "oz": unitType = "mass"; break;
- case "lb": unitType = "mass"; break;
- case "ml": unitType = "volume"; break;
- case "l": unitType = "volume"; break;
- case "tsp": unitType = "volume"; break;
- case "tbsp": unitType = "volume"; break;
- case "ozfl": unitType = "volume"; break;
- case "cup": unitType = "volume"; break;
- case "pt": unitType = "volume"; break;
- case "qt": unitType = "volume"; break;
- case "gal": unitType = "volume"; break;
- case "mm": unitType = "length"; break;
- case "cm": unitType = "length"; break;
- case "m": unitType = "length"; break;
- case "in": unitType = "length"; break;
- case "ft": unitType = "length"; break;
- default: unitType = "other"; break;
- }
- return unitType;
- },
- createRecipesFromSquare: function(squareItems, merchantId){
- let recipes = [];
- for(let i = 0; i < squareItems.length; i++){
- if(squareItems[i].item_data.variations.length > 1){
- for(let j = 0; j < squareItems[i].item_data.variations.length; j++){
- let item = squareItems[i].item_data.variations[j];
- let price = 0;
- if(item.item_variation_data.price_money !== undefined) price = item.item_variation_data.price_money.amount;
- let recipe = new Recipe({
- posId: item.id,
- merchant: merchantId,
- name: `${squareItems[i].item_data.name} '${item.item_variation_data.name}'`,
- price: price
- });
- recipes.push(recipe);
- }
- }else{
- let recipe = new Recipe({
- posId: squareItems[i].item_data.variations[0].id,
- merchant: merchantId,
- name: squareItems[i].item_data.name,
- price: squareItems[i].item_data.variations[0].item_variation_data.price_money.amount,
- ingredients: []
- });
- recipes.push(recipe);
- }
- }
- return recipes;
- },
- getAllMerchantTransactions: async function(merchant, token){
- let body = {
- location_ids: [merchant.locationId],
- limit: 10000,
- query: {}
- };
- let options = {
- headers: {
- "Authorization": `Bearer ${token}`,
- "Content-Type": "application/json"
- }
- };
- do{
- let response = await axios.post(`${process.env.SQUARE_ADDRESS}/v2/orders/search`, body, options);
- body.cursor = response.data.cursor;
- let transactions = [];
- for(let i = 0; i < response.data.orders.length; i++){
- let transaction = new Transaction({
- merchant: merchant._id,
- date: new Date(response.data.orders[i].created_at),
- posId: response.data.orders[i].id,
- recipes: []
- });
- if(response.data.orders[i].line_items === undefined) continue;
- for(let j = 0; j < response.data.orders[i].line_items.length; j++){
- let item = response.data.orders[i].line_items[j];
- for(let k = 0; k < merchant.recipes.length; k++){
- if(merchant.recipes[k].posId === item.catalog_object_id){
- transaction.recipes.push({
- recipe: merchant.recipes[k]._id,
- quantity: parseInt(item.quantity)
- });
- }
- }
- }
- transactions.push(transaction);
- }
- Transaction.create(transactions);
- }while(body.cursor !== undefined);
- }
- }
|