UNPKG

attendanz

Version:

Attendanz Synchronization

169 lines (156 loc) 8.31 kB
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 } } })