import { Meteor } from 'meteor/meteor'; if(Meteor.isServer) { WebApp.connectHandlers.use("/reports/AnnualTotals", (req, res, next) => { try { let result = Meteor.collections.Sales.aggregate([{$group: {_id: {$substr: ['$date', 0, 4]}, total: {$sum: {$multiply: ["$price", "$amount"]}}}}]); result.toArray().then(function(result) { res.writeHead(200, {'Content-Type': 'text/csv'}); res.write("Year,Sales Total\n"); for(let i = 0; i < result.length; i++) { res.write(result[i]._id); res.write(","); res.write("" + result[i].total); res.write("\n"); } res.end(); }); } catch(err) { console.log(err); res.end(); } }); WebApp.connectHandlers.use("/reports/MonthlyTotals", (req, res, next) => { try { let result = Meteor.collections.Sales.aggregate([{$group: {_id: {$substr: ['$date', 0, 6]}, total: {$sum: {$multiply: ["$price", "$amount"]}}}}]); result.toArray().then(function(result) { res.writeHead(200, {'Content-Type': 'text/csv'}); res.write("Date,Sales Total\n"); result.sort(function(a, b) { return parseInt(a._id) - parseInt(b._id); }); for(let i = 0; i < result.length; i++) { res.write(result[i]._id.substr(4, 2) + "/" + result[i]._id.substr(0, 4)); res.write(","); res.write("" + result[i].total); res.write("\n"); } res.end(); }); } catch(err) { console.log(err); res.end(); } }); WebApp.connectHandlers.use("/reports/TagTotals", (req, res, next) => { try { //Aggregate all the sales by product id & year, then later create a map between products and tags to create tag totals. let result = Meteor.collections.Sales.aggregate([{ $group: { _id: {$concat: ["$productId", "-", {$substr: ['$date', 0, 4]}]}, productId: {$first: "$productId"}, year: {$first: {$substr: ['$date', 0, 4]}}, total: {$sum: {$multiply: ["$price", "$amount"]}} } }]); result.toArray().then(function(result) { let productSalesTotalsMapByYear = {}; //Create a map of maps: year -> product id -> sales totals. for(let next of result) { let productSalesTotalsMap = productSalesTotalsMapByYear[next.year]; //Create the map if necessary. if(productSalesTotalsMap === undefined) productSalesTotalsMap = productSalesTotalsMapByYear[next.year] = {}; productSalesTotalsMap[next.productId] = next.total; } //Now create a mapping between the tag id's and tag names for later use. let tagIdToTagNameMap = {}; let tags = Meteor.collections.ProductTags.find({}, {fields: {_id: 1, name: 1}}).fetch(); for(let tag of tags) { tagIdToTagNameMap[tag._id] = tag.name; } //Now create a map between tag names -> [product ids] so that we can build a table below. let tagProductIdsMap = {}; let products = Meteor.collections.Products.find({}, {fields: {_id: 1, tags: 1}}).fetch(); for(let product of products) { for(let tagId of product.tags) { let tagName = tagIdToTagNameMap[tagId]; let productIds = tagProductIdsMap[tagName]; //Initialize the array if undefined, and add to the mapping. if(productIds === undefined) productIds = tagProductIdsMap[tagName] = []; productIds.push(product._id); } } //Collect the years in ascending oder. let years = Object.keys(productSalesTotalsMapByYear).sort(function(a, b) {return parseInt(a) - parseInt(b);}); //Write the response table. res.writeHead(200, {'Content-Type': 'text/csv'}); //Start with the table headers: Tag, Year1, Year2, .. res.write("Tag"); //Iterate over the years and add them to the headers. for(let year of years) { res.write("," + year); } res.write('\n'); //Now write the tag name, and the annual totals for each tag as a row. for(let tagName in tagProductIdsMap) { let productIds = tagProductIdsMap[tagName]; //console.log(result[i].name + "::" + result[i].total); res.write(tagName); //Iterate over each year to add its total as a column. for(let year of years) { let productSalesTotalsMap = productSalesTotalsMapByYear[year]; let annualTotal = 0; //Iterate over all the product id's for the tag and sum the annual totals for each product that is tagged. for(productId of productIds) { let productAnnualTotal = productSalesTotalsMap[productId]; if(productAnnualTotal) annualTotal += productAnnualTotal; } res.write("," + annualTotal); } res.write('\n'); } res.end(); //let tagSalesTotals = []; //let tagIdToNameMap = []; ////Find all products and collect sales totals by tag id. //let products = Meteor.collections.Products.find({}, {fields: {_id: 1, tags: 1}}).fetch(); // //for(let product of products) { // for(let tag of product.tags) { // let tagSalesTotal = tagSalesTotals[tag]; // let productSalesTotal = productSalesTotalsMap[product._id]; // // if(tagSalesTotal === undefined) tagSalesTotal = 0; // if(productSalesTotal === undefined) productSalesTotal = 0; // // tagSalesTotals[tag] = tagSalesTotal + productSalesTotal; // } //} // ////Find all tags and convert the tag id's to tag names. //let tags = Meteor.collections.ProductTags.find({}, {fields: {_id: 1, name: 1}}).fetch(); // //for(let tag of tags) { // tagIdToNameMap[tag._id] = tag.name; //} ////Write the response table. //res.writeHead(200, {'Content-Type': 'text/csv'}); // //res.write("Tag,Sales Total\n"); // ////result.sort(function(a, b) { //// return a.name > b.name ? 1 : -1; ////}); // //for(let tagId in tagSalesTotals) { // let tagTotal = tagSalesTotals[tagId]; // let tagName = tagIdToNameMap[tagId]; // // //console.log(result[i].name + "::" + result[i].total); // res.write(tagName + ',' + tagTotal + '\n'); //} // //res.end(); }).catch((err) => { console.log(err); res.end(); }); //Get all tags //Get all products for each tag //Total all sales for each product //let tags = Meteor.collections.ProductTags.find({},{fields: {_id: 1, name: 1}}).fetch(); //let result = []; // //for(let tag of tags) { // let tagTotal = 0; // let products = Meteor.collections.Products.find({tags: tag._id}, {fields: {_id: 1}}).fetch(); // // for(let product of products) { // let sales = Meteor.collections.Sales.find({productId: product._id}, {fields: {amount: 1, price: 1, _id: 0}}).fetch(); // // for(let sale of sales) { // tagTotal += sale.amount * sale.price; // } // } // // result.push({name: tag.name, total: tagTotal}); //} //res.writeHead(200, {'Content-Type': 'text/csv'}); // //res.write("Tag,Sales Total\n"); // //result.sort(function(a, b) { // return a.name > b.name ? 1 : -1; //}); // //for(let i = 0; i < result.length; i++) { // console.log(result[i].name + "::" + result[i].total); // res.write(result[i].name); // res.write(","); // res.write("" + result[i].total); // res.write("\n"); //} // //res.end(); } catch(err) { console.log(err); res.end(); } }); WebApp.connectHandlers.use("/reports/WeekYearTable", (req, res, next) => { try { let result = Meteor.collections.Sales.aggregate([{$group: {_id: {$substr: ['$date', 0, 6]}, total: {$sum: {$multiply: ["$price", "$amount"]}}}}]); result.toArray().then(function(result) { res.writeHead(200, {'Content-Type': 'text/csv'}); res.write("Date,Sales Total\n"); result.sort(function(a, b) { return parseInt(a._id) - parseInt(b._id); }); for(let i = 0; i < result.length; i++) { res.write(result[i]._id.substr(4, 2) + "/" + result[i]._id.substr(0, 4)); res.write(","); res.write("" + result[i].total); res.write("\n"); } res.end(); }); } catch(err) { console.log(err); res.end(); } }); }