more work

This commit is contained in:
Dobie Wollert
2015-04-20 05:31:12 -04:00
parent 397b828024
commit 411ee25a5e
456 changed files with 37079 additions and 109 deletions

255
app/controllers/pms.js Normal file
View File

@ -0,0 +1,255 @@
var mongoose = require('mongoose'),
Client = mongoose.model('Client'),
Workorder = mongoose.model('Workorder');
var log = require('log4node');
var Promise = require('bluebird');
var _ = require('lodash');
exports.index = function(req, res) {
log.info("pms.index");
var month = req.param('month');
var type = req.param('type');
var frequency = req.param('frequency');
year = 2015;
if (month == "")
month = undefined;
var results;
switch(type) {
case 'all':
results = allPipeline(year, month, frequency);
break;
case 'due':
results = duePipeline(year, month, frequency);
break;
case 'overdue':
results = overduePipeline(year, month, frequency);
break;
case 'scheduled':
results = scheduledPipeline(year, month, frequency);
break;
case 'complete':
results = completePipeline(year, month, frequency);
break;
}
if (results) {
results.then(function(result) {
res.json(result);
});
} else {
res.json(400, "bad request");
}
};
function allPipeline(year, month, frequency) {
var clients = getClients().then(filterClientsByFrequency(month, frequency));
var pms = getPmsByDate(year, month);
return Promise.join(clients, pms, joinData(false, frequency));
}
function duePipeline(year, month, frequency) {
var clients = getClients().then(filterClientsByFrequency(month, frequency));
var pms = getPmsByDate(year, month);
return Promise.join(clients, pms, joinData(true, frequency));
}
function overduePipeline(year, month, frequency) {
if (month !== undefined) {
month -= 1;
if (month < 0) {
month = 11;
year -= 1;
}
}
return duePipeline(year, month, frequency);
}
function scheduledPipeline(year, month, frequency) {
var clients = getClients().then(filterClientsByFrequency(month, frequency));
var pms = getPmsByDate(year, month);
return Promise.join(clients, pms, joinData(false, frequency, 'scheduled'));
}
function completePipeline(year, month, frequency) {
var clients = getClients().then(filterClientsByFrequency(month, frequency));
var pms = getPmsByDate(year, month);
return Promise.join(clients, pms, joinData(false, frequency, 'paid'));
}
function getPmsByDate(year, month) {
var pipeline = [];
if (month !== undefined) {
pipeline = [
{ $match: {
reason: "Preventive Maintenance",
maintenanceType: { $exists: true, $ne: "" },
deleted: { $ne: true }
}},
{ $group: {
_id: {
year: { $year: "$scheduling.start" },
month: { $month: "$scheduling.start" },
client: "$client",
frequency: "$maintenanceType"
},
workorders: { $push: { id: "$_id", identifier: "$biomedId", status: "$status" }}
}},
{ $group: {
_id: {
year: "$_id.year",
month: "$_id.month",
client: "$_id.client",
},
frequencies: { $push: { frequency: "$_id.frequency", workorders: "$workorders" } }
}},
{ $group: {
_id: {
year: "$_id.year",
month: "$_id.month",
},
clients: { $push: { client: "$_id.client", frequencies: "$frequencies" } }
}},
{ $match: {
"_id.year": parseInt(year),
"_id.month": parseInt(month) + 1
}}
];
} else {
pipeline = [
{ $match: {
reason: "Preventive Maintenance",
maintenanceType: { $exists: true, $ne: "" },
deleted: { $ne: true }
}},
{ $group: {
_id: {
client: "$client",
frequency: "$maintenanceType"
},
workorders: { $push: { id: "$_id", identifier: "$biomedId", status: "$status" }}
}},
{ $group: {
_id: {
client: "$_id.client",
},
frequencies: { $push: { frequency: "$_id.frequency", workorders: "$workorders" } }
}},
];
}
return Workorder.aggregateAsync(pipeline)
.then(function(pmsData) {
var data = {};
if (month !== undefined) {
if (pmsData.length > 0) {
pmsData[0].clients.forEach(function(entry) {
data[entry.client] = {};
entry.frequencies.forEach(function(frequency) {
data[entry.client][frequency.frequency] = frequency.workorders;
});
});
}
} else {
pmsData.forEach(function(entry) {
data[entry._id.client] = {};
entry.frequencies.forEach(function(frequency) {
data[entry._id.client][frequency.frequency] = frequency.workorders;
});
});
}
return data;
});
}
function getClients() {
return Client.find({ deleted: false })
.lean()
.select('name identifier frequencies')
.slice('contacts', 1)
.sort('name')
.execAsync();
}
function filterClientsByFrequency(month, frequency) {
return function(clients) {
var results = [];
clients.forEach(function(client) {
var enabledFrequencies = [];
var reasons = [];
Object.keys(client.frequencies).forEach(function(frequencyName) {
var monthData = client.frequencies[frequencyName];
if (monthData[month] || month === undefined) {
if (!frequency || frequency == frequencyName) {
enabledFrequencies.push(frequencyName);
}
}
});
if (enabledFrequencies.length > 0) {
client.frequencies = enabledFrequencies;
results.push(client);
}
});
return results;
}
}
function joinData(showOnlyDue, frequency, status) {
return function(clients, pms) {
var results = [];
clients.forEach(function(client) {
var id = client._id;
if (pms[id]) {
client.frequencies = _.difference(client.frequencies, Object.keys(pms[id]));
client.workorders = _.transform(pms[id], function(result, workorders, key) {
workorders = _.filter(workorders, function(workorder) {
return !status || workorder.status == status;
});
if (workorders.length > 0 && (!frequency || frequency == key)) {
result[key] = workorders;
}
});
}
if (_.isEmpty(client.workorders)) {
delete client.workorders;
}
var includeForFrequencies = !_.isEmpty(client.frequencies) || !showOnlyDue;
var includeForStatus = !_.isEmpty(client.workorders) || !status;
if (includeForFrequencies && includeForStatus) {
results.push(client);
}
});
return results;
}
}

View File

@ -1,8 +1,9 @@
doctype 5
html(lang="en", ng-app="biomed", ng-controller="biomed.PageCtrl")
html(lang="en", ng-app="biomed", ng-controller="PageCtrl")
head
title Atlantic Biomedical
!{css}
base(href='/')
body
error-panel
.navbar