소스 검색

Add backend to return transactions and purchases for a list of dates. Create frontend function to create the data list and request that data.

Lee Morgan 6 년 전
부모
커밋
74ecf66a67
5개의 변경된 파일106개의 추가작업 그리고 40개의 파일을 삭제
  1. 56 1
      controllers/otherData.js
  2. 9 7
      controllers/renderer.js
  3. 2 0
      routes.js
  4. 30 25
      views/dataPage/fetchData.js
  5. 9 7
      views/dataPage/ingredient.js

+ 56 - 1
controllers/otherData.js

@@ -3,6 +3,7 @@ const axios = require("axios");
 
 const Merchant = require("../models/merchant");
 const Purchase = require("../models/purchase");
+const Transaction = require("../models/transaction");
 
 module.exports = {
     //POST - Creates a new purchase for a merchant
@@ -129,6 +130,60 @@ module.exports = {
                 req.session.error = "Error: Unable to retrieve data from Clover";
                 return res.redirect("/");
             });
-        
+    },
+
+    //POST - Gets transactions and purchases between 2 dates for a merchant
+    //Inputs:
+    //  req.body.from = start date
+    //  req.body.to = end date
+    //Returns:
+    //  transactions = list of transactions between the dates provided
+    //  purchases = list of purchases between the dates provided
+    getData: function(req, res){
+        if(!req.session.user){
+            req.session.error = "Must be logged in to do that";
+            return res.redirect("/");
+        }
+
+        let promiseList = [];
+
+        for(let i = 0; i < req.body.dates.length; i+=2){
+            promiseList.push(new Promise((resolve, reject)=>{
+                Transaction.find({merchant: req.session.user, date: {$gte: req.body.dates[i], $lt: req.body.dates[i+1]}},
+                    {date: 1, recipes: 1, _id: 0},
+                    {sort: {date: 1}})
+                    .then((transactions)=>{
+                        resolve(transactions);
+                    })
+                    .catch((err)=>{});
+            }));
+
+            promiseList.push(new Promise((resolve, reject)=>{
+                Purchase.find({merchant: req.session.user, date: {$gte: req.body.dates[i], $lt: req.body.dates[i+1]}},
+                    {date: 1, ingredients: 1, _id: 0},
+                    {sort: {date: 1}})
+                    .then((purchases)=>{
+                        resolve(purchases);
+                    })
+                    .catch((err)=>{})
+            }));
+        }
+
+        Promise.all(promiseList)
+            .then((response)=>{
+                let newList = [];
+
+                for(let i = 0; i < response.length; i+=2){
+                    newList.push({
+                        transactions: response[i],
+                        purchases: response[i+1]
+                    });
+                }
+
+                return res.json(newList);
+            })
+            .catch((err)=>{
+                return res.json("Error: unable to retrieve user data");
+            });
     }
 }

+ 9 - 7
controllers/renderer.js

@@ -142,16 +142,16 @@ module.exports = {
             return res.redirect("/");
         }
 
+        let date = new Date();
+        let firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
+        let lastDay = new Date();
+
         let merchTransPromise = new Promise((resolve, reject)=>{
             Merchant.findOne({_id: req.session.user}, 
                 {name: 1, inventory: 1, recipes: 1, _id: 0})
                 .populate("recipes")
                 .populate("inventory.ingredient")
                 .then((merchant)=>{
-                    let date = new Date();
-                    let firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
-                    let lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
-
                     Transaction.find({merchant: req.session.user, date: {$gte: firstDay, $lt: lastDay}},
                         {date: 1, recipes: 1, _id: 0},
                         {sort: {date: 1}})
@@ -164,8 +164,9 @@ module.exports = {
         });
 
         let purchasePromise = new Promise((resolve, reject)=>{
-            Purchase.find({merchant: req.session.user},
-                {date: 1, ingredients: 1, _id: 0})
+            Purchase.find({merchant: req.session.user, date: {$gte: firstDay, $lt: lastDay}},
+                {date: 1, ingredients: 1, _id: 0},
+                {sort: {date: 1}})
                 .then((purchases)=>{
                     resolve(purchases);
                 })
@@ -177,7 +178,8 @@ module.exports = {
                 let data = {
                     merchant: response[0].merchant,
                     transactions: response[0].transactions,
-                    purchases: response[1]
+                    purchases: response[1],
+                    dates: [firstDay, lastDay]
                 }
 
                 return res.render("dataPage/data", {data: data});

+ 2 - 0
routes.js

@@ -40,6 +40,8 @@ module.exports = function(app){
     app.get("/cloverlogin", otherData.cloverRedirect);
     app.get("/cloverauth*", otherData.cloverAuth);
 
+    app.post("/getdata", otherData.getData);
+
     //Transactions
     app.post("/transactions", transactionData.getTransactions);
     app.get("/purchases", transactionData.getPurchases);

+ 30 - 25
views/dataPage/fetchData.js

@@ -1,31 +1,36 @@
-window.dataLoaded = false;
+window.fetchData = function(from, to){
+    retrieveDates = [];
 
-let date = new Date();
-let yearAgo = new Date(new Date().setFullYear(date.getFullYear() - 1));
+    //Compares dates to dates already stored and makes a list of those needed
+    for(let i = 0; i < data.dates.length; i+=2){
+        if(to <= new Date(data.dates[0]) || from >= new Date(data.dates[data.dates.length - 1])){
+            retrieveDates.push(from);
+            retrieveDates.push(to);
+            break;
+        }
 
-let onDataLoad = function(){
-    let dateSort = document.querySelector("#dateSort");
-    dateSort.onclick = ()=>{window.homeObj.newDates()};
-    dateSort.classList = "button";
+        let date0 = new Date(data.dates[i]);
+        let date1 = new Date(data.dates[i+1]);
 
-    let ingredientsBody = document.querySelector("#ingredientsData tbody");
-    for(let row of ingredientsBody.children){
-        row.classList = "clickableRow";
-        row.onclick = ()=>{window.ingredientObj.display("ingredient", row.ingredient)};
+        if(from < date0){
+            retrieveDates.push(from);
+            retrieveDates.push(date0);
+            from = date1;
+        }else if(from > date0 && from < date1){
+            from = date1;
+        }
     }
 
-    window.dataLoaded = true;
-}
+    axios.post("/getData", {dates: retrieveDates})
+        .then((response)=>{
+            if(typeof(response.data) === "string"){
+                banner.createError(response.data);
+            }else{
+                console.log(response.data);
+                //Append data
 
-axios.post("/transactions", {from: yearAgo, to: date})
-    .then((response)=>{
-        if(typeof(response.data) === "string"){
-            banner.createError(response.data);
-        }else{
-            data.transactions = response.data;
-            onDataLoad();
-        }
-    })
-    .catch((err)=>{
-        console.log(err);
-    });
+                //change to/from in date list
+            }
+        })
+        .catch((err)=>{});
+}

+ 9 - 7
views/dataPage/ingredient.js

@@ -52,7 +52,9 @@ window.ingredientObj = {
 
         if(ingredient){
             this.graph.clear();
-            this.graph.addData(this.formatData(type, ingredient.id));
+            let d = new Date();
+            d.setDate(d.getDate() - 20);
+            this.graph.addData(this.formatData(type, ingredient.id, d, new Date()));
 
             for(let label of document.querySelector("#ingredientOptions").children){
                 if(label.innerText === ingredient.name){
@@ -64,17 +66,17 @@ window.ingredientObj = {
         }
     },
 
-    formatData: function(type, id){
-        dataList = new Array(365).fill(0);
-        let today = new Date();
+    formatData: function(type, id, startDate, endDate){
+        let dataList;
         
         if(type === "ingredient"){
-            let dataLastDate = new Date(data.transactions[0].date);
-            let dateRange = Math.floor((Date.UTC(today.getFullYear(), today.getMonth(), today.getDate()) - Date.UTC(dataLastDate.getFullYear(), dataLastDate.getMonth(), dataLastDate.getDate())) / (1000 * 60 * 60 * 24));
+            let dateRange = Math.floor((Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()) - Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate())) / (1000 * 60 * 60 * 24));
+            dataList = new Array(Math.abs(dateRange)).fill(0);
 
             for(let transaction of data.transactions){
                 let transDate = new Date(transaction.date);
-                let diff = Math.floor((Date.UTC(transDate.getFullYear(), transDate.getMonth(), transDate.getDate()) - Date.UTC(today.getFullYear(), today.getMonth(), today.getDate())) / (1000 * 60 * 60 * 24));
+                let diff = Math.floor((Date.UTC(transDate.getFullYear(), transDate.getMonth(), transDate.getDate()) - Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate())) / (1000 * 60 * 60 * 24));
+
                 if(diff <= 0){
                     for(let recipe of transaction.recipes){
                         for(let merchRecipe of data.merchant.recipes){