attendanz
Version:
Attendanz Synchronization
169 lines (156 loc) • 8.31 kB
JavaScript
const ADODB = require('node-adodb');
const request = require('request');
const chokidar = require('chokidar');
const fs = require('fs');
const nconf = require('nconf');
const glob = require("glob");
nconf.argv();
console.log("====================================================================================================");
if(nconf.get('companyname') === true || !nconf.get('companyname')) {
console.log("CONFIG >", "Please enter company name in argument [Example : node node_modules/attendanz --dbpath \"<XXXXXXXXX>\" --companyname \"<XXXXXXXXX>\"]");
process.exit()
}
var expression = "Program Files*/*/*20*.mdb";
var cwd = "C:";
if(nconf.get('dbpath')) {
expression = "*20*.mdb";
cwd = nconf.get('dbpath');
}
glob(expression, {cwd: cwd, nocase: true}, function (er, files) {
if(files){
console.log("PREPARE >", files.length, "database file(s) was found in", cwd);
for(i in files) {
var database_file_path = cwd + "\\" + files[i];
console.log("PREPARE >", "Database file was found:", database_file_path);
var connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + database_file_path + ';');
process.env.DEBUG = 'ADODB';
if(nconf.get('companyname')) {
var watcher = chokidar.watch(database_file_path.replace('(','*').replace(')','*'), {
ignored: /(^|[\/\\])\../,
persistent: true,
interval: 3000,
});
watcher.on('add', function(path) {
var sql = 'SELECT USERID, Name, "' + nconf.get('companyname') + '" AS COMPANY_NAME ';
sql += 'FROM USERINFO ';
connection.query(sql).on('done', function(data) {
// console.log(data);
if(Object.keys(data).length > 0) {
console.log("EMPLOYEE SEND >", Object.keys(data).length, "Employee(s) was found send to server:");
request.post({
url: 'http://attendanz.co/get-user-from-nodejs.php'
, form: data
}, function (error, response, body) {
if(response.statusCode == 200) {
console.log("EMPLOYEE SEND >", "Result:", body)
if(nconf.get('test')) {
console.log("TEST RECORD >", "You enable test mode. Start to insert test record");
connection.query('SELECT TOP 1 USERID AS FIRST_USERID FROM USERINFO ORDER BY USERID').on('done', function(data) {
console.log("TEST RECORD >", data);
if(data[0]['FIRST_USERID']) {
var sql = 'INSERT INTO CHECKINOUT(USERID, CHECKTIME, CHECKTYPE, VERIFYCODE, SENSORID, WorkCode, UserExtFmt) VALUES (' + data[0]['FIRST_USERID'] + ', NOW(), "I", 1, 1, 0, 8);';
console.log("TEST RECORD >", sql);
connection.execute(sql).on('done', function(data) {
console.log("TEST RECORD >", "Inserted");
}).on('fail', function(error) {
console.log("TEST RECORD >", "Cannot insert test data:", error);
});
}
}).on('fail', function(error) {
console.log("TEST RECORD >", "ERROR!!! when query FIRST_USERID:", error, "Please try to run as Administrator");
});
}
if(nconf.get('reset')) {
console.log("RESET RECORD >", "You enable reset mode. Start to reset all records to be unsend");
var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 0 WHERE UserExtFmt <> 0;';
connection.execute(sql).on('done', function(data) {
console.log("RESET RECORD >", "All UserExtFmt field has been updated.");
}).on('fail', function(error) {
console.log("RESET RECORD >", "Error when update UserExtFmt:", error);
});
}
}else{
console.log("EMPLOYEE SEND >", "statusCode:", response.statusCode)
}
});
// var sql = 'SELECT COUNT(USERINFO.USERID) AS TOTAL ';
// sql += 'FROM CHECKINOUT ';
// sql += 'INNER JOIN USERINFO ON CHECKINOUT.USERID = USERINFO.USERID ';
// sql += 'WHERE UserExtFmt <> 9;';
// connection.query(sql).on('done', function(data) {
// console.log("CHECKINOUT SEND >", data[0]);
// console.log("CHECKINOUT SEND >", data[0]['TOTAL'] + " need to send to server. If you are testing then something wrong");
// if(data[0]['TOTAL'] > 200) {
// console.log("CHECKINOUT SEND >", "More than 200 records need to send to server you can use SQL to update database directly ");
// // should ask yes/no
// // enable this if you don't want to send old records to server (just want to notify new record)
// // var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 9 WHERE UserExtFmt <> 9;';
// // connection.execute(sql).on('done', function(data) {
// // console.log("ADD >", "All UserExtFmt field has been updated.");
// // }).on('fail', function(error) {
// // console.log("ADD >", "Error when update UserExtFmt:", error);
// // });
// }
// console.log("ADD >", "Still watching", path, "for change.");
// }).on('fail', function(error) {
// console.log("ADD >", "Error when getting total record record:", error);
// });
}else{
console.log("ERROR >", "No employee in databse !!!", data);
}
}).on('fail', function(error) {
console.log("ADD >", "Error when getting total record record:", error);
});
console.log("ADD >", "Watching", path, "for change...");
}).on('change', (path, stats) => {
console.log("CHANGE >", "!!! Change was found.")
var sql = 'SELECT TOP 1 CHECKINOUT.USERID, USERINFO.NAME, "' + nconf.get('companyname') + '" AS COMPANY_NAME';
sql += ', CHECKTIME, UserExtFmt';
sql += ', FORMAT(CHECKTIME, "yyyy-mm-dd hh:mm:ss") AS CHECKTIME_FORMAT_ORIGINAL';
sql += ', IIF(FORMAT(CHECKTIME, "yyyy") > 2500, FORMAT(DATESERIAL(YEAR(CHECKTIME)-543, MONTH(CHECKTIME), DAY(CHECKTIME)), "yyyy-mm-dd"), FORMAT(CHECKTIME, "yyyy-mm-dd")) AS CHECKTIME_DATE';
sql += ', FORMAT(CHECKTIME, "hh:mm:ss") AS CHECKTIME_TIME';
sql += ' FROM CHECKINOUT INNER JOIN USERINFO ON CHECKINOUT.USERID = USERINFO.USERID';
sql += ' WHERE (UserExtFmt <> 9) AND (DateDiff ("d", CHECKTIME, NOW()) <= 35)';
sql += ' ORDER BY IIF(DATEVALUE(CHECKTIME) = DATE(), 0, DateDiff ("s", CHECKTIME, NOW())) ASC, CHECKTIME ASC;';
console.log("CHANGE >", "Then query first 1 unsend checkinout record");
console.log(sql);
connection.query(sql).on('done', function(data) {
if(Object.keys(data).length >= 1) {
console.log("CHANGE >", "New record was found:", data[0]);
request.post({
url: 'http://attendanz.co/get-from-nodejs.php'
, form: data[0]
}, function (error, response, body) {
if(response.statusCode == 200) {
try {
body = JSON.parse(body);
} catch (e) {
console.log(e)
console.log("Returned result body:", body)
}
console.log("CHANGE >", "Record has been sent. This is response:", JSON.stringify(body, null, 2));
var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 9 WHERE CHECKTIME = CDate("' + body.CHECKTIME + '") OR CHECKTIME = CDate("' + body.CHECKTIME_THAI + '");';
console.log("CHANGE >", "Then mark UserExtFmt field to be 9 = sent: {", sql, "}");
connection.execute(sql).on('done', function(data) {
console.log("CHANGE >", "Done (but not sure it is updated or not):", data);
}).on('fail', function(error) {
console.log("CHANGE >", "Error when update UserExtFmt:", error);
});
}else{
console.log("CHANGE >", "statusCode:", response.statusCode)
}
});
}else{
console.log("CHANGE >", "No new record. Keep watching...");
}
}).on('fail', function(error) {
console.log("CHANGE >", "Error when query unsend record:", error);
});
});
}else{
console.log("CONFIG >", "Please enter company name in argument [Example : node node_modules/attendanz --dbpath \"<XXXXXXXXX>\" --companyname \"<XXXXXXXXX>\"]");
}
break
}
}
})