Redesigned the querying for the sale duplicates screen to use aggregation; Finished the styling of the sale duplicate screen; Tested the functionality of sale duplicates; Added a way to show hidden (ignored) duplicates.
This commit is contained in:
57
server/cleanDates.js
Normal file
57
server/cleanDates.js
Normal file
@@ -0,0 +1,57 @@
|
||||
|
||||
|
||||
Meteor.methods({
|
||||
// Cleans up all Date objects that don't have a time component. Removes any time component.
|
||||
"cleanDates": function() {
|
||||
|
||||
// Update the sales dates.
|
||||
|
||||
let sales = Sales.find({}).fetch();
|
||||
|
||||
for(let i = 0; i < sales.length; i++) {
|
||||
if(sales[i].date && _.isDate(sales[i].date)) {
|
||||
let date = ~~(moment(sales[i].date).format("YYYYMMDD"));
|
||||
|
||||
console.log("Converted " + sales[i].date + " to " + date);
|
||||
|
||||
// Save to the database.
|
||||
Sales.update(sales[i]._id, {$set: {date}}, function(err, id) {
|
||||
if(err) console.log(err);
|
||||
}, {bypassCollection2: true});
|
||||
}
|
||||
}
|
||||
|
||||
console.log("+++++++++++++++++++++++++++++++ FINISHED Sales +++++++++++++++++++++++++++++");
|
||||
|
||||
// Update the product price effective dates.
|
||||
|
||||
let products = Products.find({}).fetch();
|
||||
|
||||
for(let i = 0; i < products.length; i++) {
|
||||
let product = products[i];
|
||||
let hasChanges = false;
|
||||
let prices = product.prices;
|
||||
|
||||
if(prices) {
|
||||
for(let prop in prices) {
|
||||
if(prices[prop] && prices[prop].effectiveDate) {
|
||||
if(_.isDate(prices[prop].effectiveDate)) {
|
||||
let oldDate = prices[prop].effectiveDate;
|
||||
|
||||
prices[prop].effectiveDate = ~~(moment(prices[prop].effectiveDate).format("YYYYMMDD"));
|
||||
console.log("Converted " + oldDate + " to " + prices[prop].effectiveDate + " for the product " + product.name);
|
||||
hasChanges = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Save the changes.
|
||||
if(hasChanges) {
|
||||
Products.update(product._id, {$set: {prices}}, function(err, id) {
|
||||
if(err) console.log(err);
|
||||
}, {validate: false, bypassCollection2: true});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
48
server/exportMissing.js
Normal file
48
server/exportMissing.js
Normal file
@@ -0,0 +1,48 @@
|
||||
let fs = require('fs');
|
||||
|
||||
Meteor.methods({
|
||||
"exportMissingSales": function() {
|
||||
try {
|
||||
let products = Products.find({}).fetch();
|
||||
let venues = Venues.find({}).fetch();
|
||||
let measures = Measures.find({}).fetch();
|
||||
let productNameMap = {};
|
||||
let venueNameMap = {};
|
||||
let measureNameMap = {};
|
||||
let sales = Sales.find({createdAt: {$gte: moment.utc("2017-01-28", "YYYY-MM-DD").toDate(), $lt: moment.utc("2017-01-29", "YYYY-MM-DD").toDate()}}).fetch();
|
||||
let output = "";
|
||||
|
||||
for(let i = 0; i < products.length; i++) {
|
||||
productNameMap[products[i]._id] = products[i].name;
|
||||
}
|
||||
for(let i = 0; i < venues.length; i++) {
|
||||
venueNameMap[venues[i]._id] = venues[i].name;
|
||||
}
|
||||
for(let i = 0; i < measures.length; i++) {
|
||||
measureNameMap[measures[i]._id] = measures[i].name;
|
||||
}
|
||||
for(let i = 0; i < sales.length; i++) {
|
||||
let sale = sales[i];
|
||||
let saleOutput = '{\n\t"date": ' + sale.date + ',\n\t "amount": ' + sale.amount + ',\n\t "price": ' + sale.price + ',\n\t "venue": "' + venueNameMap[sale.venueId] + '",\n\t "product": "' + productNameMap[sale.productId] + '",\n\t "measure": "' + measureNameMap[sale.measureId] + '",\n\t "createdAt": "' + sale.createdAt + '"\n}';
|
||||
|
||||
if(output.length > 0) {
|
||||
output += ",\n";
|
||||
}
|
||||
else {
|
||||
output = "[";
|
||||
}
|
||||
|
||||
output += saleOutput;
|
||||
}
|
||||
|
||||
fs.writeFile("./exportedMissingSales.json", output, function(err) {
|
||||
if(err) console.log(err);
|
||||
});
|
||||
|
||||
output += "]";
|
||||
console.log(output);
|
||||
} catch(err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
});
|
||||
24
server/handleDuplicateSales.js
Normal file
24
server/handleDuplicateSales.js
Normal file
@@ -0,0 +1,24 @@
|
||||
Meteor.methods({
|
||||
"checkDuplicateSales": function() {
|
||||
try {
|
||||
let sales = Sales.find({}).fetch();
|
||||
let duplicateCount = 0;
|
||||
|
||||
for(let i = 0; i < sales.length; i++) {
|
||||
let next = missingData[i];
|
||||
let count = Sales.find({date: next.date, measureId: next.measureId, productId: next.productId, venueId: next.venueId, price: next.price, amount: next.amount}).count();
|
||||
|
||||
if(count > 1) {
|
||||
console.log("This sale has a duplicate:");
|
||||
console.log(next);
|
||||
}
|
||||
}
|
||||
|
||||
console.log("Total Duplicate Count: " + duplicateCount);
|
||||
console.log("Finished Checking Duplicates");
|
||||
Meteor.log.info("xxx");
|
||||
} catch(err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
});
|
||||
5469
server/importMissing.js
Normal file
5469
server/importMissing.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -17,3 +17,5 @@ if (!process.env.MAIL_URL) {
|
||||
}
|
||||
|
||||
// console.log("Mail settings: " + process.env.MAIL_URL);
|
||||
|
||||
if(Meteor.log) Meteor.log.info("Server Started");
|
||||
|
||||
Reference in New Issue
Block a user