Files
biomedjs/mongo-upgrade.js
2013-05-06 03:38:29 -04:00

322 lines
7.6 KiB
JavaScript

var env = process.env.NODE_ENV || 'development',
config = require('./config/config')[env],
fs = require('fs'),
async = require('async'),
mongoose = require('mongoose');
mongoose.connect(config.database);
var modelPath = __dirname + '/app/model'
fs.readdirSync(modelPath).forEach(function (file) {
require(modelPath + '/' + file)
})
var mysql = require('mysql');
var pool = mysql.createPool(config.mysql);
var Client = mongoose.model('Client');
var User = mongoose.model('User');
var Workorder = mongoose.model('Workorder');
var Counter = mongoose.model('Counter');
mongoose.connection.on('error', function(err) {
console.log(err);
});
mongoose.connection.on('disconnected', function(msg) {
console.log("Disconnected");
});
var frequencies = ["annual","semi","quarterly","sterilizer","tg","ert","rae","medgas","imaging","neptune","anesthesia"];
var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
var systemUser;
var userMap = {};
var clientMap = {};
var workorderMap = {};
var maxWorkorderId = 0;
async.series([
importUsers,
createSystemUser,
processQuery('SELECT * FROM user', processUser),
processQuery('SELECT * FROM client', processClient),
processQuery('SELECT * FROM workorder', processWorkorder),
processQuery('SELECT * FROM workorder_tech', processWorkorderTech),
updateCounter,
],
function(err, result) {
if (err) throw err;
console.log("Import Complete");
mongoose.connection.close(function(dberr) {
if (dberr) {
console.log("Error disconnecting from mongo: ");
console.log(dberr);
} else {
process.exit();
}
});
});
function importUsers(callback) {
fs.readFile(__dirname + '/users.json', 'utf8', function(err, data) {
if (err) {
return callback(err);
}
var data = JSON.parse(data);
async.each(data, function(user, userCallback) {
var id = user.id;
delete user.id;
console.log("Adding user: " + user.name.first + " " + user.name.last);
new User(user).save(function(err, result) {
if (id) {
if (!Array.isArray(id)) id = [id];
id.forEach(function(biomedid) {
userMap[biomedid] = result.id;
});
}
userCallback(err);
});
}, callback);
});
}
function createSystemUser(callback) {
new User({
name: {
first: 'System',
last: 'User'
},
email: 'system@atlanticbiomedical.com',
}).save(function(err, result) {
systemUser = result.id;
callback(err, result);
});
}
function processUser(row, callback) {
if (userMap[row.id]) {
console.log("Found preconfigured user: " + row.first_name + " " + row.last_name);
return callback(null);
}
var user = {
name: {
first: row.first_name,
last: row.last_name
},
email: row.email || 'unknown@atlanticbiomedical.com',
perms: [],
groups: [],
deleted: true
};
if (row.user_type_id === 1) {
user.groups.push("all");
}
console.log("Adding deleted user: " + user.name.first + " " + user.name.last);
new User(user).save(function(err, result) {
userMap[row.id] = result.id;
callback(err, result);
});
}
function processClient(row, callback) {
var client = new Client({
name: row.client_name,
identifier: row.client_identification,
address: {
street1: row.address || null,
street2: row.address_2 || null,
city: row.city || null,
state: row.state || null,
zip: row.zip || null
},
contacts:[{
name: row.attn || undefined,
phone: row.phone || undefined,
email: row.email || undefined
}]
});
if (row.secondary_attn || row.secondary_phone || row.secondary_email) {
client.contacts.push({
name: row.secondary_attn || undefined,
phone: row.secondary_phone || undefined,
email: row.secondary_email || undefined
});
}
client.frequencies = {};
if (row.frequency && row.frequency.toString()) {
var str = row.frequency.toString();
var frq = client.frequencies['legacy'] = [false, false, false, false, false, false, false, false, false, false, false, false];
for (m in months) {
if (str.indexOf(months[m]) !== -1) {
frq[m] = true;
}
}
}
for (key in frequencies) {
var frequency = frequencies[key];
var data = row["frequency_" + frequency];
var frq = client.frequencies[frequency] = [false, false, false, false, false, false, false, false, false, false, false, false];
if (data && data.toString()) {
var str = data.toString();
for (m in months) {
if (str.indexOf(months[m]) !== -1) {
frq[m] = true;
}
}
}
}
client.save(function (err, result) {
clientMap[row.id] = result.id;
callback(err, result);
});
}
function processWorkorder(row, callback) {
var jobDate = row.job_date;
if (!jobDate) return callback(null, null);
var jobStart = buildJobTime(jobDate, row.job_start);
var jobEnd = buildJobTime(jobDate, row.job_end);
var workorder = new Workorder({
biomedId: row.id,
client: clientMap[row.client_id],
createdOn: new Date(Date.parse(row.job_scheduled_date)),
createdBy: systemUser,
reason: mapReason(row.reason),
remarks: row.remarks,
status: mapStatus(jobStart),
scheduling: {
start: jobStart,
end: jobEnd
},
calendarId: row.google_event_id,
});
workorder.save(function(err, result) {
if (err) return callback(err);
workorderMap[row.id] = result.id;
maxWorkorderId = Math.max(maxWorkorderId, row.id);
Client.findByIdAndUpdate(clientMap[row.client_id], { $push: { 'workorders': result.id } }, callback);
});
}
function processWorkorderTech(row, callback) {
var workorderId = workorderMap[row.workorder_id];
var userId = userMap[row.user_id];
if (workorderId && userId) {
Workorder.findByIdAndUpdate(workorderId, { $push: { 'techs': userId }}, callback);
} else {
console.log("Unable to map workorder: " + row.workorder_id + " -> " + row.user_id);
callback(null);
}
}
function updateCounter(callback) {
new Counter({
name: 'workorder',
seq: maxWorkorderId
}).save(callback);
}
function processQuery(sql, processor) {
return function(callback) {
pool.getConnection(function(err, connection) {
if (err) return console.log(err);
var calls = [];
console.log('Executing query "' + sql + '"')
connection.query(sql, function(err, rows) {
if (err) return console.log(err);
console.log("Found " + rows.length + " rows");
rows.forEach(function(row) {
calls.push(function(callback) {
processor(row, callback);
});
});
async.parallel(calls, function(err, result) {
if (err) return callback(err);
console.log("Finished processing query");
callback(null);
});
});
});
}
}
function buildJobTime(date, time) {
return new Date(Date.parse(date + ' ' + parseJobTime(time)));
}
function parseJobTime(str) {
if (str.length == 3) {
return '0' + str.substr(0, 1) + ':' + str.substr(1, 2) + ':00';
} else {
return str.substr(0, 2) + ':' + str.substr(2, 2) + ':00';
}
}
var reasons = {
"18": "Add New Equipment",
"24": "As Directed",
"7": "Autoclave Repair",
"21": "Calibration",
"9": "Delivery",
"10": "Diagnose Problem",
"19": "Install Parts",
"22": "Off",
"23": "PM Reschedule",
"17": "Preventive Maintenance",
"6": "Printer Failure",
"20": "Repair"
};
function mapReason(reason) {
if (reasons[reason]) {
return reasons[reason];
} else {
return reason;
}
}
function mapStatus(jobDate) {
if (jobDate < new Date(2012, 3, 10)) {
return 'invoiced';
} else {
return 'scheduled';
}
}