UNPKG

attendanz-sync

Version:

Attendanz Synchronization V2

243 lines (230 loc) 11.4 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") const line = require('line-api') var notify = new line.Notify({token: 'UBOfbjsg3fGxXK4PvEkzNtL9madBRk5AuCg0Eri5P72'}) // Attendanz-Sync Notify Line Group nconf.argv() var companyname = nconf.get('companyname') function error_notify (e) { if (e.message == 'unknown error: call function result missing \'value\'') { notify.send({message: 'Please install follow https://goo.gl/e5NtCS again with new driver.chrome.version'}) } else { notify.send({message: e.toString()}) } } function line_log () { // notify.send({message: JSON.stringify(arguments, null, 2)}) } function set_data_response (error, response, body) { try { if (response) { if (response.statusCode == 200) { var result = JSON.parse(body) if (typeof result.affected_rows == 'undefined' || result.affected_rows < 0) { line_log(companyname, "SQL:", result.sql) line_log(companyname, "Returned result:", result) } else if (result.affected_rows == 1) /* mean inserted */ { line_log(companyname, "Affected Rows:", result.affected_rows, 'in', result.table) sent_total++ var conclusion = { table: result.table , total: row_total , sent: sent_total } line_log(companyname, conclusion) if (row_total == sent_total) { notify.send({message: JSON.stringify(conclusion)}) } } else if (result.affected_rows == 2) /* mean updated */ { line_log(companyname, "SQL:", result.sql) line_log(companyname, "Returned result:", result) } return result } else { line_log(companyname, "statusCode:", response.statusCode) } } } catch (e) { error_notify(e) } } if (companyname === true || !companyname) { line_log(companyname, "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) { line_log(companyname, "PREPARE >", files.length, "database file(s) was found in", cwd) for (i in files) { var database_file_path = cwd + "\\" + files[i] line_log(companyname, "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 (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, "' + companyname + '" AS COMPANY_NAME FROM USERINFO' connection.query(sql).on('done', function(all_users) { // line_log(companyname, all_users) if (Object.keys(all_users).length > 0) { // line_log(companyname, "EMPLOYEE SEND >", Object.keys(all_users).length, "Employee(s) was found send to server:") for (j in all_users) { // line_log(companyname, "EMPLOYEE SEND >", all_users[j]) var data = { table: 'user' , where: { User_ID: all_users[j]['USERID'] } , row: { User_ID: all_users[j]['USERID'] , Name: all_users[j]['Name'] } } request.post({ url: 'https://' + companyname + '.attendanz.co/set-data.php' , form: data }, function (error, response, body) { if (response.statusCode == 200) { // line_log(companyname, "EMPLOYEE SEND >", "Result:", body) /* if (nconf.get('test')) { line_log(companyname, "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) { line_log(companyname, "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);' line_log(companyname, "TEST RECORD >", sql) connection.execute(sql).on('done', function(data) { line_log(companyname, "TEST RECORD >", "Inserted") }).on('fail', function(error) { line_log(companyname, "TEST RECORD >", "Cannot insert test data:", error) }) } }).on('fail', function(error) { line_log(companyname, "TEST RECORD >", "ERROR!!! when query FIRST_USERID:", error, "Please try to run as Administrator") }) } */ /* if (nconf.get('reset')) { line_log(companyname, "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) { line_log(companyname, "RESET RECORD >", "All UserExtFmt field has been updated.") }).on('fail', function(error) { line_log(companyname, "RESET RECORD >", "Error when update UserExtFmt:", error) }) } */ } else { line_log(companyname, "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) { // line_log(companyname, "CHECKINOUT SEND >", data[0]) // line_log(companyname, "CHECKINOUT SEND >", data[0]['TOTAL'] + " need to send to server. If you are testing then something wrong") // if (data[0]['TOTAL'] > 200) { // line_log(companyname, "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) { // // line_log(companyname, "ADD >", "All UserExtFmt field has been updated.") // // }).on('fail', function(error) { // // line_log(companyname, "ADD >", "Error when update UserExtFmt:", error) // // }) // } // line_log(companyname, "ADD >", "Still watching", path, "for change.") // }).on('fail', function(error) { // line_log(companyname, "ADD >", "Error when getting total record record:", error) // }) } else { line_log(companyname, "ERROR>", "No employee in databse !!!", data) } }).on('fail', function(error) { line_log(companyname, "ADD >", "Error when getting total record record:", error) }) line_log(companyname, "ADD >", "Watching", path, "for change...") }).on('change', (path, stats) => { line_log(companyname, "CHANGE >", "!!! Change was found.") var sql = 'SELECT TOP 1 CHECKINOUT.USERID, USERINFO.NAME, "' + 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;' line_log(companyname, "CHANGE >", "Then query first 1 unsend checkinout record") line_log(companyname, sql) connection.query(sql).on('done', function(sign_rows) { if (Object.keys(sign_rows).length >= 1) { line_log(companyname, "CHANGE >", "New record was found:", sign_rows[0]) var data = { table: 'sign' , where: { Time: sign_rows[0]['CHECKTIME_DATE'] + ' ' + sign_rows[0]['CHECKTIME_TIME'] } , row: { User_ID: sign_rows[0]['USERID'] , Time: sign_rows[0]['CHECKTIME_DATE'] + ' ' + sign_rows[0]['CHECKTIME_TIME'] } } request.post({ url: 'https://' + companyname + '.attendanz.co/set-data.php' , form: data }, function (error, response, body) { if (response.statusCode == 200) { try { body = JSON.parse(body) } catch (e) { line_log(companyname, e) line_log(companyname, "Returned result body:", body) } line_log(companyname, "CHANGE >", "Record has been sent. This is response body:", body) // line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(body)) // line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(response, null, 2)) // line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(response)) // line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(error, null, 2)) // line_log(companyname, "CHANGE >", "Record has been sent. This is response:", JSON.stringify(error)) var sql = 'UPDATE CHECKINOUT SET UserExtFmt = 9 WHERE CHECKTIME = CDate("' + body.CHECKTIME + '") OR CHECKTIME = CDate("' + body.CHECKTIME_THAI + '");' line_log(companyname, "CHANGE >", "Then mark UserExtFmt field to be 9 = sent: {", sql, "}") connection.execute(sql).on('done', function(data) { line_log(companyname, "CHANGE >", "Done (but not sure it is updated or not):", data) }).on('fail', function(error) { line_log(companyname, "CHANGE >", "Error when update UserExtFmt:", error) }) }else{ line_log(companyname, "CHANGE >", "statusCode:", response.statusCode) } }) }else{ line_log(companyname, "CHANGE >", "No new record. Keep watching...") } }).on('fail', function(error) { line_log(companyname, "CHANGE >", "Error when query unsend record:", error) }) }) }else{ line_log(companyname, "CONFIG >", "Please enter company name in argument [Example : node node_modules/attendanz --dbpath \"<XXXXXXXXX>\" --companyname \"<XXXXXXXXX>\"]") } break } } else { line_log(companyname, "Cannot find any database file") } })